子目录中的.htaccess文件
在计算机的文件系统中,每个文件和目录各自都配有许可权限,这些权限规定了哪些文件是可读的,哪些是可写入的,哪些是可执行的。
许可权限系统是一种保护用户网站安全性的基本措施。默认WordPress安装目录中,每个文件和文件夹(如目录)都带有相应的许可权限设置,它利用服务器中已有的许可限制设置来决定尚未设定权限的设置,非常安全。
尽管如此,有时却只能在安全和方便中二者择其一:有些WordPress插件为了保证读写文件时的方便,对目录的安全设置会相对宽松。
示例
WordPress中有些插件能够上传、编辑并管理图片文件。在插件的选项栏中进行设置后,这些插件就可以读取并写入基本图像目录。为保证目录在各个服务器中都能正常运行,运行php/服务器的程序要具备基本图像目录的写入权限(权限777)。尽管如此,目录权限为777意味着某种安全漏洞:恶意访问者可以上传脚本到目录中并攻击网站。
从安全角度考虑,具有自由写入权限的目录也应采取保护措施,哪怕只是很小的保护措施。开始时可以设定744等较高的权限,然后逐步将权限降到合适的等级。尽量只在必要时暂时使用777权限。
suEXEC是什么?
通过suEXEC功能,Apache用户可以在自己的用户ID(不同于调用web服务器的用户ID)下运行CGI和SSI程序。正常情况下执行CGI或SSI程序的用户ID即调用web服务器的用户ID。
如果使用得当,suEXEC能够极大地降低用户开发运行个人CGI和SSI所带来的安全风险。但如果配置不当,suEXEC不仅可能带来很多问题,甚至可能生成新的计算机安全漏洞。对那些不了解管理用户标识符程序以及相应的安全问题的用户,我们不推荐使用suEXEC。
问题
如何在保护WordPress安装目录的同时享受WordPress插件所带来的附加功能?
用.htaccess文件保护个人目录
用.htaccess文件可以解决上面提出的问题。你可以在任何许可权限较为宽松(如760,766,775以及777)的目录中添加.htaccess文件,也可以阻止某个目录和它所有子目录中的脚本执行,还可以禁止某一类型文件外的其它所有文件的写入。
保护特定文件类型
以下代码段可禁止在目录中使用.jpeg, .jpg, .png. 以及 .gif文件外所有文件:
<Files ^(*.jpeg|*.jpg|*.png|*.gif)> order deny,allow deny from all </Files>
下面这个代码示例用<FilesMatch>指令来指定能够被访问的文件类型。将“Allow”改为“Deny”可以拒绝所有访问。
<FilesMatch ".(ico|pdf|flv|jpg|jpeg|mp3|mpg|mp4|mov|wav|wmv|png|gif|swf|css|js)$"> Allow from All </FilesMatch>
禁止脚本执行
浏览器发送请求时,使用以下代码可以禁止执行.pl, .cgi 或者 .php等可执行脚本。通过以下代码,Web浏览器将这些可执行文件当作文本文件来处理。这些文件会在浏览器窗口中以普通文本形式显示出来。
AddType text/plain .pl .cgi .php
Options -ExecCGI指令是.htaccess文件中一个作用较广泛的指令。该指令决定.htaccess文件中哪些内容是其它Apache模块所允许的。-ExecCGI规定,如果文件被记录由 cgi-script处理器进行处理,该文件将不允许出现。 第二行中的AddHandler指令列举了cig-scripts的所有文件扩展名,所有尝试获取这些文件的请求都会被返回403错误——访问被拒绝。
Options -ExecCGI AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
最后你还可以使用一个指令来命令文件类型(非处理器)。该指令删除所有与扩展名相关的处理器和动作,然后以文本/普通形式使用文件,但该指令不会改写之前的示例范围。
<FilesMatch ".(php|pl|py|jsp|asp|htm|shtml|sh|cgi)$"> ForceType text/plain </FilesMatch>
远程控制vs本地请求
什么时候使用REDIRECT_STATUS环境变量
在下面的代码中,我们利用AddHandler和 Action指令来为Apache设置REDIRECT_STATUS环境变量。这样做的原因是,.php文件请求被发送时,Apache不仅要处理该文件,还要将文件转换为/cgi-bin/php.cgi脚本。执行转换操作的可以是一个真正的php-cgi解析器,也可以仅仅是一个可执行php解析器的shell脚本。
AddHandler php-cgi .php Action php-cgi /cgi-bin/php.cgi
下面的代码建立了一个环境变量PHPRC,然后执行php.cgi文件。
#!/bin/sh export PHP_FCGI_CHILDREN=3 export PHPRC=/home/custom-ini exec /home/bin/php.cgi
下面的代码所执行的php解析器(如果解析器存在)位于执行脚本的当前路径中:
#!/bin/sh exec php
你可以用它来锁定htaccess目录和文件,甚至可以锁定带有REDIRECT_STATUS环境变量的请求。这是因为REDIRECT_cgi环境变量只赋值给本地请求。注意,请求/cgi-bin/php.cgi 文件的是Apache,因此请求才会被定义为本地请求。如果访问的页面以.php结尾,REDIRECT_变量将在apache把它的控制权转交给/cgi-bin/php.cgi文件时赋值给给apache。因此,如果/cgi-bin/php.cgi文件不具有REDIRECT_STATUS变量赋值,你可以锁定所有对/cgi-bin/php.cgi文件的请求。
REDIRECT_STATUS
REDIRECT_STATUS变量起源于内部请求,该变量最初(REDIRECT_STATUS变量的历史甚至早于php)被用于处理ErrorDocument(错误文件)。ErrorDocument一般由用户行为触发,例如,用户请求的页面不存在会导致404错误页面,但之后将用户的请求重定向到ErrorDocument的则是Apache,这类似于为.php文件重定向。ErrorDocument的这一特征使它能够从导致错误的请求中意识到环境设置和环境变量的存在。REDIRECT_STATUS只是REDIRECT_众多变量中的一个,几乎所有传递到重定向脚本的安全变量都以REDIRECT_为前缀。
采用访问控制
现在我们只需要具有REDIRECT_STATUS环境变量赋值的请求,那么我们就可以将其它请求定向到403禁止访问页面。要达到这一效果,请把下列代码添加到/cgi-bin/.htaccess文件中:
Order Deny,Allow Deny from All Allow from env=REDIRECT_STATUS
联合访问与FilesMatch
以下代码可进入/.htaccess文件并将不可变的正则表达式应用于php[0-9].(ini|cgi)</tt>
<FilesMatch "^php5?.(ini|cgi)$"> Order Deny,Allow Deny from All Allow from env=REDIRECT_STATUS </FilesMatch>
拒绝非200的REDIRECT_STATUS
我们也可以用mod_rewrite进一步限制访问,只要用200状态码进行重定向就可以了。如果默认ErrorDocument的php脚本是其本身,重定向就完成了。类似于
ErrorDocument 403 /error.php
这样的代码,其REDIRECT_STATUS为403。
用mod_rewrite拒绝请求
RewriteEngine On RewriteCond %{ENV:REDIRECT_STATUS} !=200 RewriteRule /cgi-bin/path/to/php - [F]
参见
分类:中文手册