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

Sas*_*234 5 php mysqli sql-injection

我知道该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()吗?

gab*_*be. 7

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.";
Run Code Online (Sandbox Code Playgroud)

有关防止 SQL 注入的更多信息,请参阅此优秀答案: 如何在 PHP 中防止 SQL 注入?

  • 现在(或可能永远)忽略该评论。a) 在它变得相关之前,还有很多其他你会/可以/应该优化的事情。并且 b) imo 您更愿意更改来自参数化(服务器端)语句方面的代码,而不是相反。厚颜无耻的版本:一旦你的项目和 google/facebook 之间的比较不是可笑的,它_可能_或者可能不会变得相关;-) (2认同)