我应该使用htmlspecialchars还是mysql_real_escape_string,还是两者都要使用?

3
我已经让用户输入了一些信息(姓名,出生日期等),然后我需要将这些值插入到数据库中。我应该使用mysql_real_escape_string()来防止MySQL注入,同时使用htmlspecialchars()来处理HTML标签,这两个函数都需要吗?还是只需要其中一个?
如果只需要使用一个,那么应该使用哪一个? 如果需要同时使用两个,那么先使用哪一个,最后使用哪一个?

2
您将输入编码和输出编码混淆了 - 简而言之,mysql_real_escape_string() = 对进入数据库的数据进行编码(但这在当前的“最佳实践”中并不必要,应该使用参数化查询),而htmlspecialchars()则是用于在将内容显示回用户时进行输出编码。输出编码绝对是必要的。我建议阅读各种OWASP备忘单/资源以获取更多信息。 - kwah
2个回答

5

我应该使用mysql_real_escape_string来防止mysql注入吗?

不需要。使用预处理语句和参数化查询。这将要求您停止使用过时的mysql_*库,转而使用更现代的东西(如PDO)。

并且htmlspecialchars用于处理html标签,两者都可以完成工作吗?

当您将数据插入HTML文档中时,使用htmlspecialchars防止XSS攻击。数据库不是HTML文档。(您可能稍后从数据库中取出数据以将其放入HTML文档中,那是使用htmlspecialchars的时候。)


1
不要使用mysql_real_escape_string()函数!你应该使用PDO。它使用预处理语句,这样就不会容易受到注入攻击,因为MySQL首先接收未参数化的SQL语句,然后再插入数据。
例如:
$dbh = new PDO();
$stmt = $dbh->prepare('INSERT INTO data (something) VALUE(:userInput)');

// No mysql_real_escape_string necessary
$stmt->execute(array(
    ':userInput' => $_POST['userInput']
));

htmlspecialchars()不能用于所有输入,但它应该被使用!通常情况下,它是在从数据库中检索数据后应用的(尽管,在忘记之前这样做可能是一个好主意),它对于您将要在HTML页面中回显的用户输入非常有用。它可以保护您免受XSS(跨站点脚本)攻击的影响,在此攻击中,恶意用户可以在您网站上的输入字段中添加包含恶意代码的<script>标签。当其他用户访问这个恶意用户发布的页面时,他们的浏览器将解释邪恶的脚本,这可能会做一些事情,比如窃取会话ID或尝试CSRF(跨站点请求伪造)。

底线:在向您的页面回显任何用户内容之前,都应该使用它。除非该内容已通过严格过滤器进行验证(例如仅接受mm/dd/yy格式的出生日期)。如果您不确定,请仍然使用它。它不会有害,只会有益!

进一步阅读:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接