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

时间:2010-03-09 21:01:53

标签: php security user-input sanitization

在PHP中,我知道使用parameterized queries是防止SQL注入的最佳方法。

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

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

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

4 个答案:

答案 0 :(得分:5)

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

htmlspecialchars($_POST['param'],ENT_QUOTES);

您还必须编码引号的原因是因为您不需要<>利用一些 xss。例如,这容易受到xss:

的攻击
print('<A HREF="http://www.xssed.com/'.htmlspecialchars($_REQUEST[xss]).'">link</a>');

您不需要&lt;&gt;在这种情况下执行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";

答案 1 :(得分:2)

您可能还想检查HTML Purifier,它会删除任何危险的HTML并保留安全输入。您还可以为允许/禁止的HTML创建自己的规则。

http://htmlpurifier.org/

答案 2 :(得分:1)

那么你可以先为某些字段创建规则,比如电子邮件,它应该包含的唯一内容是字母,数字,@(at-symbol?它真正称之为什么)和句点,因此你不能形成一个XSS因此,不需要使用htmlentities()htmlspeicalchars()来浪费资源。

答案 3 :(得分:0)

不,

1)预处理语句不是SQL注入的解决方案。在大多数情况下,预处理语句意味着变量绑定,因此透明转义是防止SQL注入的有效方法。

2)你没有消毒输入 - 你消毒输出。通过各种方式验证输入(例如,确保开始日期在结束日期之前),但数据的表示只应在它离开PHP代码时更改。清理直接写入HTML的数据的方法不同于清理写入URL的数据的方式与清理数据的方式不同,将数据写入javascript字符串变量不同于清理数据以插入SQL语句的方式不同与将数据发送到调制解调器之前清理数据的方式不同...

......你打算怎么办?创建数据的每个可能的表示?创建数据的通用表示?

http://xkcd.com/327/

下进行。