我的函数库中有一个名为sanitse的函数。它接受一个字符串的参数并返回已清理的字符串。
function sanitise($data){
return htmlentities(mysql_real_escape_string($data));
}
我正在开发一个论坛,我需要清理以文本形式提交的数据。 (它存储在数据库中)。但是出现了问题。存储数据时,新行表示为\ r \ n,并且在检索后出现在线程上。应该有一个新的行。 nl2br没有对它进行排序,我在另一篇文章中读到,这应该在问题的根源(函数)处理,而不是“黑客”解决方案来纠正它。
如果我没有清理数据,评论会正确显示。但这当然不安全。
我们将非常感激地收到任何建议。
答案 0 :(得分:2)
无论如何,你所做的事情并不安全。你真的应该明白你在做什么。
mysql_real_escape_string():此函数接受一个字符串并将其转义,以便在SQL语句中使用它。所有这一切都使查询解析器清楚了解什么是数据,以及查询是什么。你明白这一点很重要。
htmlentities()/ htmlspecialchars():这些函数可以转义字符串,以便在HTML解析器不考虑<
或"
等字符的情况下使用它们是HTML。这些实体变为<
和"
。
您必须在正确的上下文中使用这些功能。通过不使用mysql_real_escape_string()
作为在查询上下文中使用之前触及字符串的最后一件事,您将否定其大部分值。您只应在将数据插入数据库时使用此函数,并且仅在字符串完全形成时才使用此函数。最好的办法是根本不使用查询中的数据。将PDO用于准备/参数化查询。这有效地从查询中删除了数据,消除了SQL注入的任何可能性。
在准备好将任意字符串插入HTML之前,您应 使用htmlentities()
。也就是说,在将东西放入数据库之前不要使用此函数。否则,您在任何其他上下文中都很难使用您的数据。这是一个真正的麻烦处理人们做这件事的混乱。不要这样做。
现在,如果您在文字中看到文字\r
或\n
,则该数据来自其他内容。不是您正在使用的两个功能。这些函数都不会插入这样的字符串。