危险的PHP功能

时间:2011-06-24 16:22:16

标签: php

我从用户输入将php函数存储到mySQL数据库,这些函数需要能够执行。

据我们所知,这可能并且将允许黑客将一个漂亮的网站变成瑞士奶酪!

这些函数很简单,不需要任何高级的PHP编码。它们更多地是关于处理单个数据阵列。

因此,如果黑客先生进入管理员部分ID,就像过滤掉任何可能会在保存到数据库之前造成严重损害的PHP功能。

像“exec,shell_exec,system,passthru,popen,proc_open,proc_close”这样的东西,任何可以允许外部输入如curl的东西都需要删除。

那么还有什么可能是危险的,应该被删除?

我也找到了这个清单: http://blog.eukhost.com/webhosting/dangerous-php-functions-must-be-disabled/

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

3 个答案:

答案 0 :(得分:13)

您永远不应该运行由用户输入定义的函数。用户可以通过数百万种方式伪装您无法阻止的函数名称。例如,您可以将函数名称保存到变量中,并使用变量运行该函数。

<?php
$test = "readfile";
$test("somePageWithDatabasePassword.php");
?>

这完全有效。如果你认为你可以测试从变量运行的函数,可以使用chr(),连接,十六进制......等等。

答案 1 :(得分:5)

  

我从用户输入将php函数存储到mySQL数据库,这些函数需要能够执行。

这是一个糟糕的主意。编译“安全”函数列表非常困难,PHP充满了本地漏洞,任何知识渊博的人都可以利用这些漏洞。

即使是白名单也很难;很难检测到$a = 'exe'; $a .= 'c'; $a('echo foo');之类的代码会调用exec。考虑一种不涉及存储可执行代码的替代策略。

答案 2 :(得分:2)

我决定去做这样的事情:

http://mustache.github.com/#demo

这将允许我的用户以自己的方式格式化数据而无需直接的PHP代码。