在PHP中,我知道使用参数化查询是防止SQL注入的最佳方法.
但是,如何清理将用于其他目的的用户输入,例如:
显示回用户(潜在的跨站点脚本向量)
处理电子邮件或填写邮件正文
htmlentities()
对非数据库使用进行清理是最好的方法吗?什么被认为是最佳做法?
在PHP中,最好的xss过滤器是:
htmlspecialchars($_POST['param'],ENT_QUOTES);
您还需要编码引号的原因是因为您不需要<>来利用某些 xss.例如,这容易受到xss的影响:
print('link');
在这种情况下你不需要<>执行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";