0

基本上,我的想法是,如果我将无法预测其内容的字符串转换为十六进制字符串,然后在接收数据的脚本中,将其转换回可读字符串,它将防止任何潜在的 XSS 漏洞,并确保任何特殊字符,如空格、和号、问号等,都不会影响 Script2.php 的执行。这是正确的,还是我需要做的更多?

在 Script1.php 中:

echo('<TD><A HREF="Script2.php?reason=' .  bin2hex($input['reason']) . '">Proceed</A></TD>');

在 Script2.php 中:

echo('<input type="text" name="reason">' . strlen($_REQUEST['reason'])?pack('H*', $_REQUEST['reason']):'<I>No reason specified</I>' . '</input>'); 
4

2 回答 2

3

基本上,您需要注意一件事:当您向外部系统发出命令时,您必须确保该命令的含义与您认为的完全一致。

如果您使用 PHP 进行编程,您经常会处理两个外部系统:

  1. 您发送 HTML 的网络浏览器,
  2. 存储数据的数据库。

对于第 1 点,通过htmlspecialchars()过滤来自数据库的数据。在某些情况下,您不想这样做,但在这些情况下,您必须确切知道为什么这不会危及用户的安全。

对于第 2 点,使用准备好的语句来插入和更新数据库记录。对于新代码,无论数据来自何处,都没有例外。对于使用不支持预准备语句的接口的旧代码,请使用诸如mysql_real_escape_string()准备值以插入或更新数据库之类的东西;再次,无论数据来自何处。

这两点是技术要求(即它们是由您使用的技术强加的)。此外,可能还有业务要求(例如有效的信用卡号、1995 年 8 月 30 日之前的生日、最多可预订 7 天的场地等)。技术需求和业务需求以不同的速度变化,因此您应该在不同的组件中处理它们。不要将准备数据以在技术上适合插入数据库与验证数据是否满足您的业务需求混为一谈。

将此应用于您的特殊场景,似乎在 Script1.php 中,您希望在 HTML 文档中的 URL 的查询字符串中使用一些数据。这urlencode()就是为了。在 Script2.php 中,浏览器向您发送了您想要发送回浏览器的数据。这对于您或您的用户的安全通常并不重要。尽管如此,数据必须通过htmlspecialchars,因为如果用户发送</input>$_REQUEST['reason']会混淆用户。目前尚不清楚,您打算使用strlenand pack; 不要那样做,除了混淆其他开发人员(这很糟糕)、用户(这也很糟糕)和潜在的攻击者(他们认为这是一种挑战而不是障碍)之外,它没有任何用处。

于 2013-08-30T00:20:21.150 回答
0

OWASP 有一些关于如何最好地预防 XSS 的非常详细的信息:https ://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet#A_Positive_XSS_Prevention_Model

于 2013-08-30T00:02:04.443 回答