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

标签 php security user-input sanitization

在 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/

相关文章:

php - 使用输入表单查看 Laravel 路由

php - 如何通过电子邮件登录显示用户名?

security - Mylar 会被黑客入侵吗?

Java scan.nextLine() 只等待int用户输入的用户输入;不等待字符串用户输入

Android:带有 X 和 Y 位置的自定义 View onClickEvent

java - 如何检查用户输入的路径是否正确?

php - 图片上传不正确

php - 当语句在 MySQL 中正常工作时如何修复 PHP 中的语法错误?

c# - src等属性如何防范XSS攻击?

python - session.credentials()对于在AWS中设置连接如何有用?