在htaccess文件中禁用php函数

3
我正在尝试创建一个流行网站的私有克隆版,该网站提供“在线编写php代码”的功能,作为个人练习。
  • 我在文本区域中编写一些代码
  • 服务器端以某种方式执行代码
  • 输出被返回
我希望输出与由Apache实例提供的完全相同,包括我代码生成的所有错误和警告。
现有的框架提供了网站页面服务(前置控制器、ORM等),因此我无法在PHP INI中使用DISABLE FUNCTIONS。否则,任何东西都将不可用。
我试图将输入保存在文件中,然后像以下代码一样运行它:
exec("php -c mycustomphpinifile input.php 2>&1 > output.txt"); 

但是输出的错误信息将不会与apache的错误信息相同。
我尝试采用的最终解决方案是在httpd.conf或.htaccess中使用php_value或php_admin_value,以便禁用一整个列表(正如您可以想象的那样)的危险函数。
然而...
php_value disable_functions "my,functions,comma,separated"

似乎无法适应如此大的列表。 我必须禁用大约2k个函数:在htaccess中使用php_value时是否存在缓冲区大小问题?有人可以猜测这个问题的解决方案吗?


我不确定这里的期望结果,如果你禁用它们,在你的应用程序中调用它们时会发生什么? - Landon
1
你必须禁用 2,000 个函数?!?! 为什么要这样做?最好的方法可能是不包括任何这些函数文件或者直接删除整个 PHP 应用程序。 - cryptic ツ
3个回答

7
根据PHP文档,你只能在php.ini文件中使用disable_functions设置,所以我很惊讶这个功能居然可以正常工作。
如果你需要对每个虚拟主机或目录进行函数限制,建议使用不同的PHP-FPM实例,每个实例都可以有自己的php.ini。它还提供了额外的安全性保障,例如每个守护进程实例的完全沙箱化。

使用不同的php.ini文件是我首先尝试的方法。然后我发现PHPIniDir指令只能设置一次,因为它是全局指令。如果切换到PHP-FPM允许我使用不同的php.ini文件,那么这就是一个解决方案。谢谢! - Damiano Barbati

5

.htaccess中无法完成此操作。更多信息在这里

但似乎可以通过以下方式完成。请参考该部分,其中指出“在public_html的.htaccess中添加以下内容:” 在这里

php_flag short_open_tag Off
php_flag register_globals Off
php_flag display_errors Off
php_flag magic_quotes_gpc Off
php_value date.timezone "Europe/Athens"
php_value session.save_path "/absolute/path/to/writable/folder/one_level_up_of/public_html"

请注意以下内容:
``` php_value disable_functions "system, exec, passthru, shell_exec, suexec, dbmopen, popen, proc_open, disk_free_space, diskfreespace, set_time_limit, leak" ```
以及关于它的脚注:
``` 这些设置只能通过默认的php.ini文件更改,如果它们未按需要配置并且您没有访问php.ini,请联系您的托管提供商为您设置! ```
另外,您是否可以访问实际的Apache2虚拟主机配置?如果是,则可以研究如何使用`suhosin.executor.func.blacklist`;请参见此页面。似乎这是一种更好的方式,可以在每个主机/域上禁用PHP函数。甚至可以每个``或``进行设置。
<VirtualHost 127.0.0.1>
ServerAlias www.test.com
ServerAdmin webmaster@test.com
DocumentRoot /home/test/public_html

php_admin_value suhosin.executor.func.blacklist "passthru, show_source, shell_exec, system, pcntl_exec, popen, pclose, proc_open, proc_nice, proc_terminate, proc_get_status, proc_close, leak, apache_child_terminate, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, escapeshellcmd, escapeshellarg"

</VirtualHost>

1
我认为你忽略了OP所说的部分:“但是如果我只写四五个函数,它就可以工作,但是我必须禁用大约2k个函数”。实际上,它已经可以工作了,但是当OP将许多函数放入列表中时,它就无法工作。 - cryptic ツ
那么它可以工作,但只有少数功能??这确实很糟糕:我运行两个虚拟主机,我需要在其中一个中禁止许多php函数。我想没有解决方案。 - Damiano Barbati
1
基本上,当我仔细阅读问题时,我把它看得太具体和认真了,但实际上它没有意义。所以@crypticツ的评论很有道理。 ;) - Giacomo1968

0

您需要在您的 vhost.conf 文件或者您的 .htaccess 文件中使用 php_admin_value 而不是 php_value

<Directory /your/application/dir>
    AllowOverride None
    DirectoryIndex index.html index.htm index.php
    php_flag log_errors on
    php_flag display_errors off
    php_value error_reporting 3
    php_value memory_limit 128M
    php_admin_value upload_tmp_dir "/your/application/dir/imagecache"
    php_value max_execution_time 10
    php_admin_value disable_functions "exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source"
</Directory>

1
尽管phpinfo显示本地信息中的disable_functions已更新,但不幸的是,这并没有真正禁用列出的php函数。 <?php echo `whoami 2>&1`; ?> <?php echo shell_exec('whoami 2>&1'); ?> - Svetoslav Marinov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接