PHP:显示信息的最佳安全实践?

Nat*_*ong 7 php security sanitization user-input

在PHP中,我知道使用参数化查询是防止SQL注入的最佳方法.

但是,如何清理将用于其他目的的用户输入,例如:

  • 显示回用户(潜在的跨站点脚本向量)
  • 处理电子邮件或填写邮件正文

htmlentities()对非数据库使用进行清理是最好的方法吗?什么被认为是最佳做法?

roo*_*ook 5

在PHP中,最好的xss过滤器是:

htmlspecialchars($_POST['param'],ENT_QUOTES);
Run Code Online (Sandbox Code Playgroud)

您还需要编码引号的原因是因为您不需要<>来利用某些 xss.例如,这容易受到xss的影响:

print('<A HREF="http://www.xssed.com/'.htmlspecialchars($_REQUEST[xss]).'">link</a>');
Run Code Online (Sandbox Code Playgroud)

在这种情况下你不需要<>执行javascript,因为你可以使用onmouseover,这是一个示例攻击:

$_REQUEST[xss]='" onMouseOver="alert(/xss/)"';
Run Code Online (Sandbox Code Playgroud)

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";
Run Code Online (Sandbox Code Playgroud)

修补:

$_GET[name]=str_replace(array("\r","\n"),$_GET[name]);
$header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP";
Run Code Online (Sandbox Code Playgroud)