保护PHP Web服务器

PHP应用程序因高于平均的安全性问题而享有声誉。 您使用什么configuration技术来确保应用程序尽可能安全?

我正在寻找像这样的想法:

  • 使用强化的PHP / Suhosin
  • 使用mod_security
  • 在php.ini中禁用register_globals和allow_url_fopen

我通常使用Linux,但也可以自由地推荐Windows解决scheme。

  1. 使用open_basedir指令将PHP脚本限制到其主目录和最终的额外应用程序目录。 这本身非常有效。

  2. 使用强化的PHP,因为它没有成本,它可以帮助。

  3. 使用suPHP作为文件的所有者(每个网站一个用户)执行PHP脚本,并避免使用具有不良权限的文件,例如777 … suPHP也可以允许您在每个网站上使用php.ini,这样一个网站的愚蠢要求不要摧毁一切。

  4. Mod_security是一个很大的优势,但需要很好的使用和configuration。

根据我的经验,基于PHP的网站上的大多数漏洞都是(站点)devise不佳的结果,而不是PHP本身的缺陷。

一些快速提示:

  • 通用filterinput,转义输出。 澄清:filter并不意味着逃生,这意味着“如果我在这个用户input中发现一些可疑的东西,导致提交失败并告诉用户重新格式化”。
  • 而不是使用escapeshellcmd(),只是不允许在shell中执行任何用户input 。 这是危险的,可能从来没有实际的必要。
  • 不要在生产站点上调用像phpinfo()这样的函数(或者如果你这样做,见下面*)。
  • 在devise一个Web应用程序时, 总是要考虑“这是一个可能的攻击媒介?” 说,SQL注入。 如果答案是“是”,请立即插入 – 不要说“好的,我将在后续的开发中join这个function”。 安全从来不是一个function。
  • 切勿向用户输出原始错误; 这意味着设置php.ini的display_errors = Off,log_errors = On。 捕捉运行时错误并输出相当漂亮的东西。 以Twitter的鲸鱼为例:它不会给用户debugging级别的信息,它只是说“woops,有什么坏事,请刷新”。

*您也可以看一下我写的一篇名为“确保phpinfo()”的短文章,并且一定要阅读http://egovsergo.com/2009/04/03/protecting-your-phpinfo/这是一个很快的想法,我必须(有点)保护phpinfo(),如果我忘了在生产网站上删除它。

更一般的方式是,一些开发人员为敏感函数编写包装,检查是否设置“生产站点”标志,并禁用生产中的敏感function。

其他参数,应该改变,以加强PHP:

safe_mode = Off register_globals = Off expose_php = Off allow_url_fopen = Off allow_url_include = Off log_errors = On error_log = /var/log/phperror.log display_errors = Off enable_dl = Off disable_functions="popen,exec,system,passthru,proc_open,shell_exec,show_source,phpinfo" 

将所有PHP错误保存在文件/var/log/phperror.log中

 touch /var/log/phperror.log chmod 666 /var/log/phperror.log 

我已经将dotdeb存储库添加到我的/etc/apt/sources.lst

 deb http://packages.dotdeb.org stable all deb-src http://packages.dotdeb.org stable all 

因为他们比Debian更频繁地修补php / apache / mysql。

考虑在“每个站点”的基础上设置open_basediropen_basedir是一个php.ini设置,它将阻止你的脚本访问定义的白名单之外的文件。 如果您的服务器托pipe多个站点,则会阻止一个站点从另一个站点读取数据库设置。 它也会阻止一个php脚本访问/修改核心系统文件。 打开basedir很容易设置,只需将“ php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list ”添加到每个Apache vhost。

还要考虑closures不应包含PHP脚本的所有站点/文件夹(例如上传的图像文件夹)的PHP脚本引擎。 同样,这很简单,将“php_admin_value引擎closures”添加到任何不需要PHP的Apache VirtualHosts。 要禁用目录中的PHP,请将相同的内容放入Directory标签中。

尽可能严格地运行文件权限,避免对Apache用户的PHP脚本的写入访问,这可以防止正在运行的脚本在同一站点/服务器上修改自身或其他脚本。 如果可能,尽量避免777权限,找出运行应用程序所需的最低权限并使用它们。

如果您要托pipe多个站点,每个站点都有自己的数据库,请为每个站点分别使用一个MySQL / Postgres用户,并为每个用户设置权限,以便他们只能访问相关的数据库。 这又会阻止恶意脚本篡改另一个应用程序的数据库。

Suosin,HardenedPHP,mod_security等都是有价值的,但除了紧密locking的configuration之外,还可以使用它们,而不是使用它们。

Suhosin的性能成本相当可观,所以“不计成本”的评论是有点偏离。

你在寻找一些基本的防火墙/拓扑build议? 我喜欢使用像英镑这样的东西的想法,以防止从未刷洗的互联网直接访问PHPnetworking服务器。 这样,您也可以将networking服务器从networking的其他部分分离出来。

使用Suhosin / mod_security / SuPHP肯定会使你的PHP服务器变得安全。 禁用某些function,如exec,passthru,system和escapeshellcmd也会有很大的帮助。