【问题标题】:sanitizing data injected to mysql from form清理从表单注入到 mysql 的数据
【发布时间】:2013-03-03 16:22:57
【问题描述】:

我的函数库中有一个名为 sanitse 的函数。它接受一个字符串的一个参数并返回经过清理的字符串。

function sanitise($data){
    return htmlentities(mysql_real_escape_string($data));
}

我正在开发一个论坛,我需要清理以文本形式提交的数据。 (它存储在数据库中)。不过也有问题出现。存储数据时,新行表示为 \r\n 并在检索后出现在线程上。应该有一个新行。 nl2br 没有解决它,我在另一篇文章中读到,这应该从问题的根源(函数)解决,而不是“破解”解决方案来纠正它。

如果我不清理数据,评论会正确显示。但这当然不安全。

如有任何建议,我们将不胜感激。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    无论如何,您所做的事情并不安全。你真的应该明白你在做什么。

    mysql_real_escape_string(): 该函数接受一个字符串并将其转义,以便可以在 SQL 语句中使用。所有这些都是为了让查询解析器清楚什么是数据,什么是查询。了解这一点很重要。

    htmlentities()/htmlspecialchars(): 这些函数对字符串进行转义,这样它们就可以在 HTML 中使用,而不会让 HTML 解析器认为 <" 等字符是 HTML。这些实体变为<"

    您必须在正确的上下文中使用这些函数。 not 使用mysql_real_escape_string() 作为在查询上下文中使用字符串之前接触字符串的最后一个东西,你否定了它的大部分值。您应该仅在将数据插入数据库时​​使用此函数,并且仅在字符串完全形成时使用。最好的办法是根本不使用查询中的数据。将 PDO 与准备好的/参数化查询一起使用。这有效地从查询中删除数据,消除任何 SQL 注入的机会。

    在您准备好将任意字符串插入 HTML 之前,您应该使用htmlentities()。也就是说,在将内容放入数据库之前不要使用此功能。否则,你会让你的数据很难在任何其他环境中使用。处理人们这样做的烂摊子真的很麻烦。不要这样做。

    现在,如果您在文本中看到文字 \r\n,则该数据来自其他内容。不是来自您正在使用的两个功能。这些函数都不会插入这样的字符串。

    另请参阅:https://stackoverflow.com/a/7810880/362536

    【讨论】:

    • 感谢您的回复。因此,在这种情况下,交换 mysql_real_escape_string 和 htmlentities 将使代码安全,当然前提是该函数是在 mysql 注入之前作为最后一件事调用的?
    • @jollinski,是的,但不要这样做!为您的数据库连接切换到 PDO,使用准备好的查询,并在 HTML 中输出任何可变数据时使用htmlspecialchars() 转义。那么,您就不必担心这些问题了。否则,您只会弄乱您的数据。
    猜你喜欢
    • 2019-06-06
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2015-06-24
    相关资源
    最近更新 更多