使用 .htaccess 覆盖 memory_limit 导致 syslog 中出现神秘警报 (suhosin)

使用 .htaccess 覆盖 memory_limit 导致 syslog 中出现神秘警报 (suhosin)

PHP 版本:PHP 5.3.10-1ubuntu3.4 with Suhosin-Patch (cli)
在 apache2 中使用:libapache2-mod-php5

PHP 的全局选项memory_limit设置为512M。到目前为止一切顺利。
现在脚本尝试分配超过此值,并因 memory_limit 而失败。到目前为止一切顺利。

但是现在发生了一件奇怪的事情。当我创建 .htacess 时,php_value memory_limit "1025M"仅使用一个 echo 请求一个简单的 PHP 文件,系统日志中就会出现错误。

9 月 21 日 18:14:02 ccollard2 suhosin[8611]: 警报 - 脚本尝试将 memory_limit 增加到 1082130432 字节,超出允许值(攻击者“*******”,文件“/home/www-data/********/bla/test.php”,第 14 行)

当我尝试将 php_value 设置为memory_limit "1024M"no 时,输出中没有显示任何错误。因此,我尝试检查一些 suhosin 配置以了解此1024M限制,但一无所获。

所以我最初的问题是:
1024M为什么即使全局选项设置为<1024M, 服务器也允许内存消耗?

我保证没有配置文件覆盖全局选项,并且 phpinfo() 显示全局设置的内存限制。 php 脚本不是这里的问题。它只是一个测试脚本。

**
更新:Suhosin 似乎具有 1024M 内存分配的默认值。
因此,用户可以使用 htaccess 将 memory_limit 设置为 1024M,而无需 htaccess 的通常全局限制。因此,使用注释限制,suhosin 具有 1024 的不可见限制,用户可以手动设置此限制。但如果不手动设置,通常的全局限制将限制用户脚本。

答案1

您提到.htaccess- 但您的发布详细信息来自CLIPHP 版本(PHP 5.3.10-1ubuntu3.4 with Suhosin-Patch (cli))。

如果CLI版本使用不同的php.ini(相当常见) - 那么这就是为什么你看不到定义1024MB

运行以下命令

php -i | grep -i php.ini

并将其与通过 Web 浏览器输出的文件进行比较,其中包含以下内容

<?php phpinfo();

如果路径php.ini不同,这就是你的答案,你正在编辑错误的文件。

对于 Suhosin

内存限制有一个特定的设置,通常定义在/etc/php5/conf.d/20suhosin.ini

suhosin.memory_limit = 1024M

答案2

我现在找到了解决方案。

全局设置的memory_limit作用类似于软限制。suhosin
限制是硬限制。没有脚本可以消耗超过 suhosin 允许的内存。

当 suhosin 的限制为 0 时,用户可以设置最高 1024M 的限制,suhosin 表示“不再消耗内存”。
只要用户脚本使用“ini_set”定义内存限制,当 suhosin 的内存限制为 0 时,它就不能超过软限制。但如果 suhosin 设置为特定的 M 整数,则不允许任何脚本消耗超过 suhosin 所说的内存。

概括
Suhosin 定义了内存限制的最大值。
通常memory_limit定义限制,这是默认限制,可以使用.htacces/覆盖ini_set。Suhosinsuhosin.memory_limit = 0或注释中定义了 1024M。

相关内容