清理从表单注入mysql的数据

时间:2013-03-15 03:29:25

标签: php mysql

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

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

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

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

我们将非常感激地收到任何建议。

1 个答案:

答案 0 :(得分:2)

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

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

htmlentities()/ htmlspecialchars():这些函数可以转义字符串,以便在HTML解析器不考虑<"等字符的情况下使用它们是HTML。这些实体变为&lt;&quot;

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

在准备好将任意字符串插入HTML之前,您应 使用htmlentities()。也就是说,在将东西放入数据库之前不要使用此函数。否则,您在任何其他上下文中都很难使用您的数据。这是一个真正的麻烦处理人们做这件事的混乱。不要这样做。

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

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