我什么时候应该使用 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

我有一个个人资料页面,如个人资料.php?user_name=damith

我在此页面的许多函数中使用了 $_GET['user_name']。

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

mysqli_real_escape_string()不再是

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

至于您的问题:任何时候您将不确定的数据(特别是如果该数据来自未知来源(如Web表单)放入数据库时,您应该确保它已针对您的数据库正确格式化。 mysqli_real_escape_string()只能对字符串文字执行此操作,这就是为什么预准备语句是更好的方法。 无论何时执行依赖于用户提交数据的查询,都应使用预准备语句。

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

情况 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 注入的更多信息,请参阅这个出色的答案:如何在 PHP 中防止 SQL 注入?

您应该在将字符串文本混合到 sql 语句中的任何参数上使用 real_escape_string。并且仅在那些字符串文本值上。

因此,对Situation 01Situation 02的描述不足以回答这些具体问题。可能是yes.