0

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

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

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

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

任何建议将不胜感激。

4

1 回答 1

2

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

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

htmlentities()/htmlspecialchars(): 这些函数对字符串进行转义,以便它们可以在 HTML 中使用,而无需 HTML 解析器认为诸如<或之类的字符"是 HTML。这些实体变成&lt;&quot;

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

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

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

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

于 2013-03-15T03:36:14.717 回答