我应该使用htmlspecialchars或mysql_real_escape_string或两者

时间:2013-06-18 10:44:26

标签: php

我让用户输入一些信息(姓名,出生日期等)。然后我必须将这些值插入数据库。我应该使用mysql_real_escape_string()来阻止mysql注入和htmlspecialchars()来处理html标签吗?他们都需要或者其中一个会这样做吗?

如果我只使用其中一个,那么哪一个? 如果我应该同时使用两者,那么首先使用哪一个,哪一个最后?

2 个答案:

答案 0 :(得分:4)

  

我应该使用mysql_real_escape_string来阻止mysql注入

没有。 Use prepared statements and parameterized queries。这将要求您停止使用过时的mysql_*库,以支持更现代的东西(如PDO)。

  

和htmlspecialchars来处理html标签,或者其中一个可以完成工作吗?

使用htmlspecialcharsprotect against XSS attacks when数据插入HTML文档。数据库不是HTML文档。 (您可能稍后将数据从数据库中取出以将其放入HTML文档中,这是使用htmlspecialchars)的时间。

答案 1 :(得分: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的出生日期)。如果你不确定,那么无论如何都要使用它。它不会受伤。它只会有所帮助!

进一步阅读: