在PHP中,我知道使用参数化查询是防止SQL注入的最佳方法。
但是,如何清除将用于其他目的的用户输入,如:
htmlentities()是净化非数据库使用的最佳方法吗?什么是这里的最佳实践?
发布于 2010-03-09 21:04:11
在php中,最好的xss过滤器是:
htmlspecialchars($_POST['param'],ENT_QUOTES);您还必须对引号进行编码的原因是,您不需要<>来利用某些xss。例如,这容易受到xss的攻击:
print('<A HREF="http://www.xssed.com/'.htmlspecialchars($_REQUEST[xss]).'">link</a>');在本例中,您不需要<>来执行javascript,因为您可以使用onmouseover,下面是一个示例攻击:
$_REQUEST[xss]='" onMouseOver="alert(/xss/)"';ENT_QUOTES处理双引号。
电子邮件有点不同,javascript不应该由邮件客户端执行,如果是,那么您的站点不会因为相同的原产地策略而受到影响。但为了安全起见,我仍然会使用htmlspecialchars($var,ENT_QUOTES);。但是,PHP的mail()函数可能会屈服于另一种类型的漏洞,称为CRLF注入。下面是针对PHP-Nuke的一个示例漏洞。如果您有这样的函数调用:mail($fmail, $subject, $message, $header);,那么您必须确保用户不能将\r\n注入$header。
易受攻击代码:
$header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP";修补:
$_GET[name]=str_replace(array("\r","\n"),$_GET[name]);
$header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP";发布于 2010-03-09 21:22:45
您也可能希望签出HTML净化器,这将剥离任何危险的HTML,并留下安全的输入。您还可以就允许/不允许哪些HTML创建自己的规则。
http://htmlpurifier.org/
发布于 2010-03-09 21:12:53
那么,您可以首先为某些字段创建规则,比如电子邮件,它只应该由字母、数字组成,@(符号)?和一个句点,所以您不能在其中形成XSS,因此不需要使用htmlentities()或htmlspeicalchars()来浪费资源。
https://stackoverflow.com/questions/2412532
复制相似问题