3

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

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

4

2 回答 2

5

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

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

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

用于htmlspecialchars在将数据插入 HTML 文档时防止 XSS 攻击。数据库不是 HTML 文档。(您可能稍后将数据从数据库中取出,放入 HTML 文档中,这就是使用时间htmlspecialchars)。

于 2013-06-18T10:46:20.067 回答
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 的生日)。如果你不确定,那么无论如何都要使用它。它不会受伤。它只会有帮助!

延伸阅读:

于 2013-06-18T10:47:05.663 回答