确保 PHP 的 exec 和其他功能的安全

确保 PHP 的 exec 和其他功能的安全

我目前正在设置托管服务,目前我非常担心安全性。以下是我的情况:

我已经设置了多个 apache 的 vhost,出于明显的安全原因,我不想让用户通过 php 的系统功能来访问其他人的数据。

这就是我在每个 vhost 中设置 open_basedir 的原因。不过,我仍然担心一个主要的安全漏洞:exec 函数。

经过一番研究,我发现您可以使用 php.ini 中的 disable_functions 来禁用某些功能,就像它的名字告诉我们的那样。我发现这个要禁用的功能列表似乎很完整:

disable_functions = "apache_child_terminate, apache_setenv, define_syslog_variables, 
escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, 
ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, 
ini_get_all, ini_restore, inject_code, mysql_pconnect, openlog, passthru, php_uname, 
phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, 
posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, 
posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, 
proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode"

但我觉得不对限制php 为我的用户准备的。因此,有两个问题:

  • 您是否认为对于大多数 CMS 和其他 Web 应用程序来说,这是一个严重的问题?
  • 如果是这样,还有其他方法来隔离每个虚拟主机数据吗?

附言:我已经寻找过 suexec 和其他的,但是我认为它们不适合,因为我的服务器上预计有 100 到 200 个用户,而我不想为每个用户创建和管理一个系统帐户。

答案1

在网络托管行业,尤其​​是在共享托管环境中,出于安全原因禁用某些 php 函数非常常见。以下是被阻止的最常见 php 函数:

exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

此外,最好为每个网站分别管理用户,因为这样如果服务器出现任何问题,您就可以轻松识别谁做错了。

为此,您可以使用 SuPHP: http://www.techtrunch.com/installations/compile-apache-suphp-ubuntu http://www.inmotionhosting.com/support/website/general-server-setup/what-is-suphp

您还可以考虑在 php.ini 中使用以下值,以使您的服务器更加安全:

  1. allow_url_fopen- 禁用通过 URL 打开文件的功能
  2. session.save_path- 设置 php 存储其会话文件的路径
  3. open_basedir- 设置允许 php 脚本打开文件的路径

答案2

Exec 仅通过执行 php 的用户执行函数。并且 apache 提供了一种以不同用户身份执行每个 vhost 的方法(https://askubuntu.com/a/899192/862510),这样您就可以为每个 vhost 创建一个用户并控制他们各自的权限,包括文件夹权限。

相关内容