【问题标题】:When Should I Use PHP mysqli_real_escape_string() Function? [duplicate]什么时候应该使用 PHP mysqli_real_escape_string() 函数? [复制]
【发布时间】:2016-07-08 19:42:38
【问题描述】:

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

【问题讨论】:

标签: php mysqli sql-injection


【解决方案1】:

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

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

【讨论】:

  • 谢谢。这意味着我几乎在每个地方都必须使用 mysqli_real_escape_string?
  • 不,这并不完全意味着 ;-) 但是......经常。您不应将 real_ecape_string 用于数字文字,例如WHERE ID>5;您不会使用 escape_string 处理 5,但要确保它确实是数字文字。而且您不会使用 real_ecape_string 处理标识符,例如表/字段名称。但是如果你把它放在像WHERE id='5' 这样的单引号中,那么你必须使用 mysql_real_escape_string; (几乎完全)不管参数的来源,也不管你是否“认为”字符串文字将只包含数字。字符串字面量->real_escape,不讨论。
【解决方案2】:

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?

【讨论】:

  • 但请记住 only 对字符串文字使用 real_escape_string,dev.mysql.com/doc/refman/5.7/en/string-literals.html。这是该功能的唯一目的。 dev.mysql.com/doc/refman/5.7/en/mysql-real-escape-string.htmlThis function creates a legal SQL string for use in an SQL statement。不多也不少。
  • prepared, parametrized statements 例如需要更多的网络往返。 IMO 它仍然是最好的默认食谱食谱。如果你曾经达到它的限制......你会知道;-)
  • 谢谢@VolkerK——我更新了我的答案,试图让它更清楚。
  • @VolkerK 因为我在共享主机中,而我正在构建的东西就像社交网络服务器资源对我来说真的很重要。但是,我无法清楚地理解您的评论。你能解释一下吗?
  • 暂时(或者可能永远)忽略该评论。 a) 在它变得相关之前,还有很多其他的事情你会/可以/应该优化。并且b)imo您宁愿更改来自参数化(服务器端)语句方面的代码,而不是相反。厚颜无耻的版本:一旦你的项目和 google/facebook 之间的比较是不可笑的,它可能或可能不相关;-)
猜你喜欢
  • 1970-01-01
  • 2013-10-17
  • 2019-12-26
  • 2014-05-19
  • 2011-06-16
  • 1970-01-01
  • 2020-05-29
  • 2012-03-18
  • 2011-06-08
相关资源
最近更新 更多