在 PHP 中,我知道使用 parameterized queries是防止 SQL 注入(inject)的最佳方法。
但是如何清理将用于其他目的的用户输入,例如:
- 向用户显示(潜在的跨站点脚本向量)
- 处理电子邮件或填写邮件正文
htmlentities()
是清理非数据库使用的最佳方法吗?这里什么被认为是最佳实践?
最佳答案
在 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 注入(inject)。这是针对 PHP-Nuke 的示例漏洞.如果您有这样的函数调用:mail($fmail, $subject, $message, $header);
那么您必须确保用户无法注入(inject) \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";
关于PHP:显示信息的最佳安全实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2412532/