内容转自 做好VPS的基础安全防护工作

使用linode VPS也有好长一段时间了,爱好linux也有很久好久了,自从2004年自己买了笔记本后就尝试安装各种linux发行版,包括FreeBSD这样的unix鼻祖,不过当时仅仅把爱好停留在装系统上面,并没有对linux网络服务器做深入的研究。

很多朋友认为买了vps把系统安装上去,环境搭建好就万事大吉了,实际上并非如此,网络一直是不安全的,我们只能尽我们最大的努力做好基础的安全防护工作,尽可能的减少被攻击的可能,尽量减少非人为因素宕机的可能。

直到自己真正的使用linux服务器后,才系统的对linux进行了学习,我的知识来源主要是鸟哥的linux私房菜基础版第三版以及鸟哥的linux私房菜服务器第三版。以下是我平时维护自己vps以及帮个别朋友维护linux服务器的一点心得,如何做好VPS的基础安全防护?

在linode新手起步教程里,我们学习了如何安装liunx操作系统,重启linode vps,执行一些基本的系统管理任务。现在我们来进一步做好VPS的安全工作,以防非法入侵。您会学习到如何启动防火墙(iptables),设置SSH安全访问密钥,自动ban某些非法ip(Fail2ban)。当然这都是非常基础的安全防护工作。

阅读剩余部分

PHP在处理正则表达式的时候,在最后面可以加上诸如/i, /is, /s, /isU的选项,他们都代表什么含义呢?

其实他们是PHP正则表达式的模式修正符,用于对正则表达式的补充。

优先级概念

正则符号的优先级:

()圆括号因为是内存处理所以第1 * ? + { } 重复匹配内容第2 ^ $ \b 边界处理第3 | 条件处理第4 最后按照运算顺序计算匹配

常用的修正符

i

(PCRE_CASELESS)正则内容在匹配时候不区分大小写(默认是区分的)。

preg_match('/\[TOC\]/i',$str) 这句话中的小写字母i,他跟在正则表达式后面,起的作用是匹配时忽略大小写 所以,上述正则表达式可以匹配诸如 [toc]、[ToC]、或者[TOC]。

m

(PCRE_MULTILINE) 在匹配首内容或者尾内容时候采用多行识别匹配。默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。 当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“/n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

S

(PCRE_DOTALL) 如果没有使用这个模式修正符号,元字符中的"."默认不能表示换行符号,将字符串视为单行。如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。

x

(PCRE_EXTENDED) 忽略正则中的空白。如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。

A

(PCRE_ANCHORED) 强制从头开始匹配。如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配即自动在模式开头加上^。此效果也可以通过适当的模式本身来实现(在 Perl 中实现的唯一方法)。

D

(PCRE_DOLLAR_ENDONLY) 强制$匹配尾部无任何内容。如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。 S 当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。

U

(PCRE_UNGREEDY) 禁止贪婪匹配 只跟踪到最近的一个匹配符并结束,常用在采集程序上的正则表达式。本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符来启用此选项。

X

(PCRE_EXTRA) 此修正符启用了一个PCRE中与Perl不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,和Perl一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。即:贪婪模式,最大限度匹配如:/a[/w]+?e/U匹配abceadeddd中的abceade而不是abce,如果不加U修正,则匹配abceu(PCRE_UTF8)此修正符启用了一个PCRE中与Perl不兼容的额外功能。模式字符串被当成UTF-8。本修正符在Unix下自PHP4.1.0起可用,在win32下自PHP4.2.3起可用。

参考PHP>手册>函数参考>文本处理>PCRE>PCRE模式

typecho的出现让我终结了使用多年的WP,小巧的体积,不错的速度

markdown支持

如果你还不懂markdown语法,请参考markdown语法

由于typecho使用了md语法,那么强烈推荐这篇文章,为你的博客加入目录功能

伪静态

如果想让你的博文地址变成这个样子www.phpgao.com/typecho.html,那就需要开启地址重写功能,俗称伪静态。

这样需要在新链接形式和旧链接形式间做一些转换,而转换的规则就定义在.htaccesshttpd.ini文件里!

linux的下的.htaccess可以直接参考WP的配置,而windows下的IIS请参考如下配置,将下面的代码拷贝至httpd.ini文件,放置到web根目录下

[ISAPI_Rewrite]

# 3600 = 1 hour
CacheClockRate 3600

RepeatLimit 32

RewriteRule ^/(admin|usr)/(.*) /$1/$2 [L]
RewriteRule ^/(.*).html$ /index.php/$1.html [L]
RewriteRule ^/archives/(.*) /index.php/archives/$1 [L]
RewriteRule ^/category/(.*) /index.php/category/$1 [L]
RewriteRule ^/author/(.*) /index.php/author/$1 [L]
RewriteRule ^/([0-9]+)/([0-9]+)/$ /index.php/$1/$2/ [L]
RewriteRule ^/tag/(.*)/$ /index.php/tag/$1 [L]
RewriteRule ^/search/(.*)/$ /index.php/search/$1 [L]
RewriteRule ^/(.*)page/(.*) /index.php/$1page/$2 [L]
RewriteRule ^/(feed.*) /index.php/$1 [L]
RewriteRule ^/action/(.*) /index.php/action/$1 [L]
RewriteRule ^/(.*)comment /index.php/$1/comment [L]
RewriteRule ^/sitemap /index.php/sitemap [L]
RewriteRule ^/go/(.*) /index.php/go/$1 [L]

一定要注意不要同时存在htaccess和httpd.ini两个文件,否则网站会莫名其妙的打不开!

插件

使用了插件后,如果插件为系统添加了一些路由,并且很不幸你的博客像我一样开启了伪静态,那么就需要在伪静态文件中添加对应的路由,把他放倒/index.php后面即可。

这里使用了一点点正则表达式的概念,如果不懂可以参考这篇文章正则表达式教程

地址重写的原理很简单,当一个请求符合RewriteRule后面的地址规则,就按照替换规则生成最终的URL,而整个过程对用户是透明的,URL地址也没有变化。

如果你的sitemap插件总是不生效,那一定要好好检查一下伪静态的设置!

引用PHP手册里的一评论

This will greatly reduce your page load time as the browser will only need to send one server request for the entire page, rather than multiple requests for the HTML and the images. Requests need to be uploaded and 99% of the world are limited on their upload speed to the server.

翻译一下就是

这种方式能够大大减少页面载入时间,因为整个页面只需要一个请求,多个针对html文档和图片的请求。请求需要被提(上)交(传),但是99%的上传速度是被限制的。

所以减少请求也是一个明确的选择!

阅读剩余部分

什么是toc?

[toc]

table of contents 即文章目录

toc有什么用

废话,你说目录有啥用,方便查找呗

使用typecho的TX,一定会一点markdown吧,在文章中如果出现##this's h2 tag##,会被程序转换为

this's h2 tag

一个h标签就好比一本书的各个章节,如果我们能把他们清点一下,组成一个目录输出,岂不是妙哉!

TOC如何使用

简单到不能再简单,在你想插入目录的地方放一个[toc][TOC]即可(推荐大写)!

[TOC]必须处于顶格

typecho中的markdown

typecho的源代码中已经使用了激进的MarkdownExtraExtended类来转化md文件,为什么说他很激进呢?因为他扩展了标准的markdown,添加了很多个性化的语法,如直接给元素添加id或者class,还有脚注、缩写词等,用起来确实很爽!但需要注意的是:太多的非标准语法可能会带来移植性差的问题

具体的语法参考请看这里php Markdown Extra

如何使typecho支持toc

要使typecho支持toc需要替换位于源程序中的/wwwroot/var/文件夹下的MarkdownExtraExtended.phpMarkdownExtraExtended.php

原理

这个文件的作用就是为typecho提供md2html的作用,我修改了MarkdownExtraExtended类的__construct方法,为block_gamut数组添加了 doToc 处理模块,并把优先级降到最低。

转换细节位于doToc_doToc_callback中,在此不作赘述。

不完美的地方

  • 要是能加入一个锚点之间平滑滚动的效果就更完美了,改天写个插件弄一弄
  • 在首页也能看到目录,改天看看源代码研究一下,看能不能解决
  • 希望后台加一个选项,自动生成目录,这个比较麻烦,以后看情况解决

双引号,单引号问题自古以来一直处在混沌状态,不懂的人觉得没啥区别,懂的人貌似也说不出来啥区别,其实区别还是有很多,转给大家看看,自己也留一份参考

转自http://blog.sina.com.cn/s/blog_706476980100xapp.html

1.单引号和双引号都可以作为字符串的开始符和关闭符,并且只能‍同一种单或者双引号来定义开始和结束;单引号之间的字符都被认为是字符,即使是转义符\和变量符$,例外的是\’标识单引号。 2.双引号之间的字符是需要php解析的,包括$,\,{都保留了php赋予的特殊含义。 3." "双引号里面的字段会经过编译器解释,然后再当作HTML代码输出;而' '单引号里面的不进行解释,直接输出。 例如:

$abc='my name is tome';
echo $abc //结果是:my name is tom
echo '$abc' //结果是:$abc
echo "$abc" //结果是:my name is tom

特别在使用MYSQL语句的时候,双引号和单引号的用法让新手不知所措,在这里,举个例子,来进行说明。 假设查询条件中使用的是常量,例如:

select    *    from    abc_table where user_name='abc';

SQL语句可以写成:

SQLstr = "select    *    from abc_table where user _name= 'abc'" ;

假设查询条件中使用的是变量,例如:

$user_name = $_REQUEST['user_name']; //字符串变量

$user=array ("name"=> $_REQUEST['user_name‘,"age"=>$_REQUEST['age'];//数组变量

SQL语句就可以写成:

SQLstr = "select    *    from abc_table where user_name = ' " . $user_name . " ' ";
SQLstr = "select * from abc_table where user_name = ' " . $user["name"] . " ' ";

对比一下:

SQLstr="select * from abc_table where user_name = ' abc ' " ;
SQLstr="select * from abc_table where user_name =' " . $user _name . " ' ";
SQLstr="select * from abc_table where user_name =' " . $user["name"] . " ' ";

SQLstr可以分解为以下3个部分:

1:"select * from table where user_name = ' " //固定SQL语句 
2:$user //变量 
3:" ' "
1,2,3部分字符串之间用"." 来连接

阅读剩余部分