恐怕您几乎无法使用 php.ini 来禁用其中的大部分内容。然而,情况变得更糟。eval()
从技术上讲,它不是一个函数,它是一种语言构造,因此不能使用它来禁用它disable_functions
。为了做到这一点,你必须安装类似的东西Suhosin并从那里禁用它。
一个好的网站管理员应该将安全审查视为网站设置的重要组成部分。不要试图完全抽象化这一点,人们对安全性已经足够懒惰了。如果您打算使用工具(例如网络主机),您应该主动至少粗略地了解如何负责任地管理工具。
也就是说,您还可以采取其他一些措施来严重削弱大多数黑客尝试,包括:
-禁用base64_decode()
using disable_functions
。现在,有很多方法可以解决这个问题,但是绝大多数黑客脚本本质上都是通用的,这将破坏其中约 95% 的脚本,因为它们需要同时存在这两个函数才能正常运行。这并不意味着您的服务器不会被黑客攻击,但在大多数情况下,这会产生手动嗅探服务器漏洞的开销,并且大多数黑客都在玩数字游戏,没有时间这样做(注意:一些黑客确实有是时候了,这本身并不是一颗灵丹妙药)。
- 过滤所有输入以查找常见的其他漏洞利用字符串模式,例如<?php
,它经常被用来在不被注意的情况下通过打开的 php 标签发出吱吱声。有几种这样的模式。最佳实践是将特定字符列入白名单并根据每个输入拒绝所有其他字符。至少,过滤掉前面提到的空终止符和可能的 sql 注入字符串,例如'; --
(不要假设简单地使用 pdo 或 mysqli 就会过滤所有注入尝试,即使您正确使用准备好的语句,仍然有一些方法可以实现这一点)。
-任何仅提供媒体服务的目录应禁用所有脚本访问,并且所有上传和媒体应仅放置在此类目录中。最好仅将可接受的媒体列入白名单,而不是将脚本列入黑名单,因为有多种方法可以执行脚本文件(例如:php
, php5
, phtml
等),它们在任何给定的服务器环境上可能单独可用,也可能不可用。您可以通过放置在媒体目录中的简单 .htaccess 来完成此操作,如下所示:
php_flag engine off
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .aspx .htm .html .shtml .sh .cgi
Options -Indexes -ExecCGI
<Files "\.(jpe?g|png|gif|bmp|tiff|swf|flv|mov|avi|mp4)$">
order deny,allow
deny from all
</Files>
这部分可以由 php 动态编写,因此您的应用程序将能够以与此类似的方式保护敏感目录,这可以减轻大量黑客的痛苦,因为这通常被忽视。我通常会在我工作的几乎每个 WordPress 网站的上传目录中添加一个类似的 .htaccess,并且经常想知道为什么这不是开箱即用的,因为它阻止了大量的黑客尝试并且不会干扰应用程序以我注意到的任何方式。
不幸的是,如果您不在 apache 服务器上,则需要找到另一个解决方案(在 IIS 上很可能有一个等效的解决方案,但我个人不知道它是什么)。
- 您还应该配置 .htaccess (或 web.config/etc)以禁用特定应用程序不需要的任何访问方法。如果你不做 RESTful Web 服务,真的没有理由允许PUT
or DELETE
,你几乎肯定还应该禁用TRACE
,并且可能也没有任何理由离开OPTIONS
or HEAD
启用任一。还应该提到的是,默认情况下所有无法识别的连接方法都会解析为GET
,这意味着我可以从命令行执行以下操作:
curl -X BOOGITY -d arg=badstuff -d arg2=morebadstuff yoursite.com
在这个例子中,BOOGITY
没有意义,但是,您的服务器会将其解释为:
curl -X GET -d arg=badstuff -d arg2=morebadstuff yoursite.com
但是您的应用程序可能不会。
为了防止这种情况,您应该将服务器配置为仅接受GET
as GET
,并且不允许它成为默认值。
在大多数情况下,主要目的不是让在您的环境中执行特定的 php 模式变得困难,重点是防止包含恶意代码(本地或外部),这样它就不会成为问题。如果您允许在 CMS 中安装模块等,草率的程序员最终会创建漏洞利用程序,除了强制执行相当严格的 API 参数之外,您实际上无能为力,这使得很难做得不好,但永远不可能变得不可能。永远不要低估离岸黑客商店或自称“php ninja”的能力,他们会以最不安全或不合规的方式努力使用您的系统,制造大量漏洞,并发明任意数量的迂回黑客技术来实现这一目标事实上,比以正确的方式去做更难实现。
/安全咆哮。