什么时候应该使用 PHP mysqli_real_escape_string() 函数?

When Should I Use PHP mysqli_real_escape_string() Function?

我知道 mysqli_real_escape_string 函数可以用来防止 SQL 注入。 (但是,mysql_real_escape_string() 不会保护您免受某些注入)

我的问题是什么时候应该使用 mysqli_real_escape_string() 函数?

情况01

我有一个包含 4 个字段的注册表单,分别是名字、姓氏、电子邮件和密码。

我是否也应该使用 mysqli_real_escape_string() 来插入查询?所有四个字段?

或者在登录表单中使用是否足够?

情况02

我的个人资料页面类似于 profile.php?user_name=damith

我在这个页面的很多函数中使用了$_GET['user_name']

我应该在所有这些函数中使用 mysqli_real_escape_string() 吗?

您应该在 任何 参数上使用 real_escape_string 作为 string literal 混合到 sql 语句中。并且仅针对那些字符串文字值。

因此 Situation 01Situation 02 的描述不足以回答这些具体问题。大概是 yes.

mysqli_real_escape_string() 不再是确保您保存在数据库中的数据安全的最佳方式。相反,您应该使用准备好的语句:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

关于您的问题:任何时候您将不确定的数据(尤其是如果该数据来自网络表单等未知来源)放入您的数据库中,您应该确保它的格式适合您的数据库. mysqli_real_escape_string() 只能对字符串文字执行此操作,这就是为什么准备好的语句是更好的方法。任何时候执行依赖于用户提交数据的查询,都应该使用准备好的语句。

当你输出数据显示给用户时,你不需要使用mysqli_real_escape_string(),而是应该使用htmlspecialchars() (http://php.net/htmlspecialchars )

情况 1 - 肯定是,甚至更好的是使用准备好的语句。

情况 2 - 如果您在网页上向用户显示数据,则不需要使用 mysqli_real_escape_string(),而应使用 htmlspecialchars() 来降低 XSS 和其他代码的风险注入攻击。

举几个例子:

<?php 
// Prepared statement.  Save the user's first name to the database:
$stmt = $mysqli->prepare("INSERT INTO users(first_name) VALUES (?)");
$stmt->bind_param("s", $first_name);
$stmt->execute();

// Echo the user's first name back to them
echo "Saved your first name: " . 
      htmlspecialchars($first_name) . " to the database.";

有关防止 SQL 注入的更多信息,请参阅这个出色的答案:How can I prevent SQL injection in PHP?