这是确保$ _REQUEST数据安全的好方法吗?

时间:2013-08-29 23:56:43

标签: php html security xss sanitization

基本上,我的想法是,如果我将其内容无法预测的字符串转换为十六进制字符串,那么在接收数据的脚本中,将其转换回可读字符串,它将防止任何潜在的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>'); 

2 个答案:

答案 0 :(得分:3)

基本上,您需要注意的一件事是:当您向外部系统发出命令时,您必须确保该命令完全符合您的意思。

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

  1. 您发送HTML的网络浏览器
  2. 存储数据的数据库。
  3. 对于第1点,通过htmlspecialchars()过滤来自数据库的数据。有些情况下您不想这样做,但在这种情况下,您必须知道完全为什么这不会影响用户的安全性。

    对于第2点,使用预准备语句来插入和更新数据库记录。对于新代码,无论数据来自何处,都存在异常。对于使用不支持预准备语句的接口的旧代码,请使用mysql_real_escape_string()之类的内容来准备插入或更新数据库的值;再次,无论数据来自何处。

    这两点是技术要求(即它们是由您使用的技术强加的)。此外,可能有业务要求(如信用卡号码有效,1995年8月30日之前的生日日期,场地最多只能预订7天,无论如何)。技术要求和业务要求以不同的速率变化,因此您应该在不同的组件中处理它们。不要混合准备数据,以便在技术上适合插入数据库,并验证数据是否符合您的业务需求。

    将此应用于您的特殊场景,似乎在Script1.php中,您希望在HTML文档中的URL的查询字符串中使用某些数据。这是urlencode()的用途。在Script2.php中,浏览器已将您要发送的数据发送回浏览器。这通常对您或您的用户安全性并不重要。但是,数据必须通过htmlspecialchars传递,因为如果用户将</input>作为$_REQUEST['reason']发送,则会使用户感到困惑。目前尚不清楚,您打算使用strlenpack;如果不这样做,除了混淆其他开发者(这是坏的),用户(也是坏的)和潜在的攻击者(他们认为是挑战而不是障碍)之外没有任何其他目的。

答案 1 :(得分:0)