几年前,我开始使用以下代码,包括在我的页面顶部。我读到这很好并且使用它。但我想知道,这有用吗?
$page = "index.php";
$cracktrack = $_SERVER['QUERY_STRING'];
$wormprotector = array('chr(', 'chr=', 'chr%20', '%20chr', 'wget%20', '%20wget', 'wget(',
'cmd=', '%20cmd', 'cmd%20', 'rush=', '%20rush', 'rush%20',
'union%20', '%20union', 'union(', 'union=', 'echr(', '%20echr', 'echr%20', 'echr=',
'esystem(', 'esystem%20', 'cp%20', '%20cp', 'cp(', 'mdir%20', '%20mdir', 'mdir(',
'mcd%20', 'mrd%20', 'rm%20', '%20mcd', '%20mrd', '%20rm',
'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'rmdir%20', 'mv(', 'rmdir(',
'chmod(', 'chmod%20', '%20chmod', 'chmod(', 'chmod=', 'chown%20', 'chgrp%20', 'chown(', 'chgrp(',
'locate%20', 'grep%20', 'locate(', 'grep(', 'diff%20', 'kill%20', 'kill(', 'killall',
'passwd%20', '%20passwd', 'passwd(', 'telnet%20', 'vi(', 'vi%20',
'insert%20into', 'select%20', 'nigga(', '%20nigga', 'nigga%20', 'fopen', 'fwrite', '%20like', 'like%20',
'$_request', '$_get', '$request', '$get', '.system', 'HTTP_PHP', '&aim', '%20getenv', 'getenv%20',
'new_password', '&icq','/etc/password','/etc/shadow', '/etc/groups', '/etc/gshadow',
'HTTP_USER_AGENT', 'HTTP_HOST', '/bin/ps', 'wget%20', 'unamex20-a', '/usr/bin/id',
'/bin/echo', '/bin/kill', '/bin/', '/chgrp', '/chown', '/usr/bin', 'g++', 'bin/python',
'bin/tclsh', 'bin/nasm', 'perl%20', 'traceroute%20', 'ping%20', '.pl', '/usr/X11R6/bin/xterm', 'lsof%20',
'/bin/mail', '.conf', 'motd%20', 'HTTP/1.', '.inc.php', 'config.php', 'cgi-', '.eml',
'file://', 'window.open', '<SCRIPT>', 'javascript://','img src', 'img%20src','.jsp','ftp.exe',
'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'xp_cmdshell', 'nc.exe', '.htpasswd',
'servlet', '/etc/passwd', 'wwwacl', '~root', '~ftp', '.js', '.jsp', 'admin_', '.history',
'bash_history', '.bash_history', '~nobody', 'server-info', 'server-status', 'reboot%20', 'halt%20',
'powerdown%20', '/home/ftp', '/home/www', 'secure_site, ok', 'chunked', 'org.apache', '/servlet/con',
'<script', '/robot.txt' ,'/perl' ,'mod_gzip_status', 'db_mysql.inc', '.inc', 'select%20from',
'select from', 'drop%20', '.system', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '<?php', '?>', 'sql=');
$checkworm = str_replace($wormprotector, '*', $cracktrack);
if ($cracktrack != $checkworm){
$cremotead = $_SERVER['REMOTE_ADDR'];
$cuseragent = $_SERVER['HTTP_USER_AGENT'];
header("location:$page");
die();
}
答案 0 :(得分:3)
总的来说,我个人不会使用这种策略。我宁愿消毒每一个输入。如果用户在URL中传递了.bash_history,我不在乎,因为它永远不会在我的脚本中执行任何操作。
如果您有一些可供任何人使用的第三方低可靠性脚本,我可能会看到这样的内容很有用。即使在那种情况下,它看起来似乎只是一种半可靠的创可贴。
对于您编写的应用程序,这应该是不必要的。
答案 1 :(得分:2)
虽然您很关注安全性,并且您遵循了怀疑地处理所有输入的原则,但我并不认为该列表非常有用。
它是一个相当随意的可能不需要的字符串/命令/标签/文件夹名称和其他东西的选择。它可能会随着时间的推移而过时,而且可能已经过时了。拥有这样的通用列表永远不会捕获所有内容,并且可能会给您的应用程序带来虚假的安全感,而实际上并非如此。
正如另一个答案已经提到的那样,您希望检查从应用程序获得的每个输入(无论是通过查询字符串变量,POST变量还是在任何地方)并验证它是否符合您的期望(例如,如果您期望的话)一个数值,是用数字传递的值吗?)。
然后,如果您计划重新显示或重新使用该数据,则可能需要进一步清理,并删除可能在使用它的上下文中可能存在危险的内容。例如,您可能会删除&#34; script&#34;标签,如果您要在网页上显示数据。
答案 2 :(得分:2)
如果您正确清理所有用户输入,则绝对不需要使用这样的脚本。
除此之外,它也区分大小写(str_replace vs str_ireplace),这意味着我可以通过使用大写和小写字母的混合来轻松绕过它。它也只检查查询字符串,对POST请求没用。