保护PHP Web服务器


Answers:


15
  1. 使用open_basedir指令将您的PHP脚本限制在其主目录以及最终的其他应用程序目录中。本身这是非常有效的。

  2. 使用强化的php,因为它不花钱,而且可以提供帮助。

  3. 使用suPHP可以使PHP脚本作为文件的所有者(每个网站一个用户)执行,并避免使用权限不佳的文件(例如777)... suPHP还可以允许您在每个网站的php.ini上使用文件,从而使一个站点变得愚蠢要求不要破坏一切。

  4. Mod_security是一大优势,但需要很好地使用和配置。


一些不良站点实际上需要register_globals和fopen,因此这就是为什么每个站点都使用suPHP来使用php.ini的原因。一个站点可以随身携带神风,而其他站点则(几乎)完全安全。
Antoine Benkemoun,2009年

4
如果他们使用register_globals和fopen,则表明质量太差了,您可能需要重新考虑使用它们:)
David Pashley 2009年

如果他们每月支付150欧元,则无需重新考虑。
Antoine Benkemoun,2009年

3

以我的经验,基于PHP的网站上的大多数漏洞是(网站)设计不佳的结果,而不是PHP本身的缺陷。

一些快速提示:

  • 普遍地过滤输入,转义输出。澄清:过滤器并不意味着逃脱,它的意思是“如果我在此用户输入中发现任何可疑之处,则导致提交失败并告诉用户重新格式化。”
  • 而不是使用escapeshellcmd(),只是不允许在shell中执行任何用户输入。这是危险的,可能实际上根本没有必要。
  • 不要在生产站点上调用phpinfo()之类的函数(否则,请参见下文*)。
  • 设计Web应用程序时,始终考虑“这是否可能是攻击媒介?” 说,SQL注入。如果答案是“是”,请立即插入-不要说“好,我会在以后的开发中将其添加为功能”。安全绝不是功能。
  • 切勿向用户输出原始错误;这意味着设置php.ini的display_errors = Off,log_errors = On。捕获运行时错误并输出一些漂亮的东西。以Twitter的鲸鱼为例:它不会为用户提供调试级别的信息,而只是说“哇,有些东西坏了,请刷新”。

*您也可以看一下我写的一篇名为“保护phpinfo(),有点类似”的简短文章,并确保阅读评论http://egovsergo.com/2009/04/03/protecting-your-phpinfo/如果我以某种方式忘记了在生产站点上删除phpinfo(),那是一个快速的主意,我必须(某种程度上)保护phpinfo()。

以更一般的方式,一些开发人员为敏感功能编写包装程序,以检查是否未设置“生产站点”标志,并在生产中禁用敏感功能。


我的问题更多是关于如何保护服务器免受不良PHP的攻击。:)我并不是说PHP本身是不安全的,更多的是它吸引了经验不足的开发人员,标准库要求他们记住保护每个调用,而不是保护所有用户的库。+1,因为这是一个非常有用的答案。
David Pashley 2009年

我有这种印象,并据此回答:)感谢您的评论!很显然,我无法在这里进行全部介绍,但是这些都是很大的陷阱。如果您有更具体的问题,可以肯定地将它们摆在Stack Overflow上,我和其他所有人将为您提供帮助。(而且值得,我是ZCE)。
msanford

3

应该修改以增强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

1

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

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

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


1

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

还可以考虑为所有不包含PHP脚本的网站/文件夹关闭PHP脚本引擎(例如,上载的图像文件夹)。同样,这很简单,将“ php_admin_value engine off”添加到不需要php的任何Apache VirtualHosts中。要在目录中禁用PHP,请将相同的内容放入Directory标记中。

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

如果您要托管多个站点,每个站点都有自己的数据库,请为每个站点使用单独的MySQL / Postgres用户,并为每个用户设置权限,以使他们只能访问相关数据库。同样,这将防止恶意脚本篡改另一个应用程序的数据库。

Suosin,HardenedPHP,mod_security等同样也很有价值,但是除了紧密锁定的配置之外,还请使用它们,而不是代替。


0

Suhosin的性能成本相当可观,因此“不花钱”的评论有点过时。


2
快速,被黑客入侵的网站有什么用?:) hardened-php.net/suhosin/benchmark.html建议在一基准测试中慢8.85%。对于它提供的安全性好处,这可能是可以接受的。这可能应该是评论而不是答案。
David Pashley

Suhosin主要保护免受本地攻击。因此,如果您与不信任的人共享服务器,则值得一试。如果您有自己的服务器或vm切片,我看不到这一点。

0

您是否在寻找一些基本的防火墙/拓扑建议?我喜欢使用磅之类的东西来防止未经清洗的互联网直接访问PHP Web服务器的想法。这样,您还可以将网络服务器与网络的其他部分隔离。


不,我正在寻找提高PHP运行时安全性的方法。
David Pashley 2009年

0

使用Suhosin / mod_security / SuPHP当然可以使您的PHP服务器安全。禁用某些功能,例如exec,passthru,system和escapeshellcmd也会有很大帮助。


1
escapeshellcmd()是否仅用于转义字符串?它没有提供任何执行流程的方法。有人怎么用它引起问题?
David Pashley 2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.