【问题标题】:PHP - Non-destructive Input SanitizationPHP - 非破坏性输入清理
【发布时间】:2011-07-07 17:34:09
【问题描述】:

我的网站上有一个TextArea,我将输入写入我的数据库。

我想过滤这个 TextArea 输入,但不删除任何 HTML 标记或其他内容。

简而言之,我想在将输入写入我的数据库之前对其进行清理和保护,但是当我从数据库中取回输入并将其写入网站时,我希望输入保持完整且未修改。

我怎样才能做到这一点?

【问题讨论】:

    标签: php mysql apache textarea sanitize


    【解决方案1】:

    如果您想在写回网站时保留数据字符,请尝试:

    $stringToSave = mysql_real_escape_string($inputString);
    

    然后在从数据库中检索时:

    $stringToPutOnPage = htmlentities($databaseString);
    

    如果您希望将 html 实际读取为 html(注意 XSS),您可以使用:

    $stringToSave = mysql_real_escape_string($inputString);
    

    编辑:似乎最好的做法是在从数据库中检索到 html 字符串之后而不是之前对其进行清理。感谢 cmets,我将不得不改变我的方法。

    【讨论】:

    • 从不在任何字符串经过mysql_real_escape_string 后进一步后处理! SQL 转义始终是您在将值插入查询之前所做的最后一件事,并且在任何其他情况下充其量是毫无意义的。
    • 在将 HTML 放入数据库时​​不应对其进行转义。将其转义以进行显示更有意义;在您打印 HTML 之前。
    • @Jonathan 让我指出,这不是一个好的解决方案。您应该在数据库中存储 HTML 转义字符串。没有必要避免 SQL 注入,这是不好的做法。您应该根据输出媒体转义您的字符串。即,只有在将字符串放入 HTML 文档时才需要 HTML 转义,所以只有在那时才这样做。如果您决定在其他任何地方输出值,例如在 JSON 上下文中,您只是通过“硬编码”您的内容以输出到 HTML 中挖了一个洞。
    【解决方案2】:

    如果你的意思是你只是想让它安全地存储在你的数据库中,你需要做的就是使用数据库特定的转义方法,例如mysql_real_escape_string。当然,这并不能保护您免受 XSS 攻击,但是如果您想检索并显示它未修改,您别无选择。

    【讨论】:

    • 最好使用 mysql_real_escape_string,因为现在不推荐使用 mysql_escape_string。
    • 是的,正如您所评论的那样正在解决这个问题:D
    • 检索和显示使用 strip_slashes()
    • mysql_escape_string 已弃用。
    【解决方案3】:

    其实很简单:

    • 为避免 SQL 注入,mysql_real_escape_string 您的值在将它们连接到 SQL 查询之前,或者首先使用不受格式错误字符串影响的参数化查询。
    • 为避免 XSS 问题和/或混乱的 HTML,HTML 在将值插入 HTML 上下文之前对其进行转义。
    • JSON 在 JSON 上下文中转义它们,CSV 在 CSV 上下文中转义它们,等等。

    真的都是同一个问题。作为一个非常简单的示例,要生成字符串"test"(我希望引号成为字符串的一部分),我不能编写字符串文字$foo = ""test""。我必须对引号内的引号进行转义,以明确哪些引号应该结束字符串以及哪些是字符串的一部分:$foo = "\"test\""

    SQL 注入、XSS 问题和混乱的 HTML 都只是其中的一种变体。
    要将包含引号的值插入查询中,您会遇到与上述相同的问题:

    $comment = "\"foo\"";  // comment is "foo", including quotes
    $query = 'INSERT INTO `db` (`comment`) VALUES ("' . $comment . '")';
           // INSERT INTO `db` (`comment`) VALUES (""foo"")
    

    这充其量会产生无效的语法,最坏的情况是 SQL 注入攻击。使用mysql_real_escape_string 可以避免这种情况:

    $query = 'INSERT INTO `db` (`comment`) VALUES ("' . mysql_real_escape_string($comment) . '")';
           // INSERT INTO `db` (`comment`) VALUES ("\"foo\"")
    

    HTML 转义完全相同,只是语法问题不同。
    您只需要使用正确的方法在正确的上下文中转义您的值。要转义 HTML 值,请使用 htmlentities。在必要的时候这样做。不要过早或过度转义您的值,仅在正确的时间在正确的上下文中应用适当的转义函数。

    【讨论】:

      猜你喜欢
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      相关资源
      最近更新 更多