什么时候应该使用 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 01
和 Situation 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?
我知道 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 01
和 Situation 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?