3

我正在尝试创建一个流行网站的私人克隆,它提供了“在线编写 php 代码”作为个人练习的可能性。

  • 我在文本区域写了一些代码
  • 代码以某种方式在服务器端执行
  • 返回输出

我希望输出与由 apache 实例提供的输出完全相同,并生成所有错误并警告我的代码。

有一个为网站网页提供服务的现有框架(前端控制器、orm 等),所以我不能在 PHP INI 中使用禁用功能。否则一切都将无法使用。

我尝试将输入保存在文件中,然后使用如下所示的 exec 运行它:

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 是否存在缓冲区大小问题?任何人都可以猜出这个问题的解决方案吗?

4

3 回答 3

6

根据PHP 文档,您不能disable_functions在文件中以外的任何地方使用该设置php.ini,所以我很惊讶这完全有效。

如果您需要对函数进行 per-vhost 或 per-directory 限制,我建议使用单独的PHP-FPM实例,每个实例都可以有自己的php.ini. 它还提供额外的安全优势,例如每个守护程序实例的完整沙盒。

于 2013-01-26T02:03:16.210 回答
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 "系统、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 功能的更好方法。也许甚至 per <Directory>or <Location>?

<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>
于 2013-01-26T01:57:52.300 回答
0

您需要在文件或文件中使用php_admin_value而不是php_valuevhost.conf.htaccess

<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>
于 2013-09-28T13:06:40.493 回答