【问题标题】:Do we have to use mysql_real_escape_string() while working with sessions?在处理会话时我们必须使用 mysql_real_escape_string() 吗?
【发布时间】:2012-07-24 07:28:48
【问题描述】:

请看下面的代码:

$username = $_POST['username'];
$_SESSION['user_name'] = $username;

在设置$username 值时,我是否必须使用mysql_real_escape_string() 函数?如果我不这样做,这里有什么威胁吗?

注意:我在使用 MySQL 时使用了 PDO。

【问题讨论】:

  • 如果使用PDO,可以使用prepare,而不需要在执行查询时转义变量。

标签: php mysql session mysql-real-escape-string


【解决方案1】:

不,您不需要在那里以任何方式逃避它。仅当您将文本与某些字符可能具有特殊含义的其他文本连接时,才需要对文本进行转义。见The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

【讨论】:

  • 你同意@asprin 吗?作为会话中的 SQL 语句会损害应用程序吗?即使在会话中存储值,过滤所有 SQL 不是更好吗?
  • @MohammadSaberi 会话中没有SQL语句;不在您发布的代码中。此外,“会话中的 SQL 语句会损害应用程序”是无稽之谈——会话和 SQL 完全不相关。
  • @Moh 在必要之前不要转义数据!是的,您可能有数据,如果在 SQL 查询中天真地使用这些数据,会导致 SQL 注入。但这并不意味着您必须在将其存储在会话中时对其进行转义,因为它在那里不会造成任何伤害。必要时逃跑,不早也不晚。如果您使用的是 PDO 准备好的语句,则根本不需要转义。
【解决方案2】:

你不必,只有当你想转义字符以将其输入数据库时​​才使用它。

【讨论】:

    【解决方案3】:

    Mysql_real_escape_string() 用于安全目的,因此用户无法进行 SQL 注入。如果您没有使用$_SESSION['user_name']$username 作为数据库,那么您不需要使用它。你可以在这里阅读更多 - http://php.net/manual/en/function.mysql-real-escape-string.php

    mysql_real_escpae_string() 为每个特殊字符添加反斜杠。

    此外,您应该查看一些 SQL 注入示例,以便了解它是如何完成的,以及 mysql_real_escape_string() 究竟在阻止什么 - http://www.unixwiz.net/techtips/sql-injection.html

    【讨论】:

      【解决方案4】:

      您不应该这样做,因为会话数据只能在服务器上进行操作。

      如果您知道您有要在查询中使用的数据并且有需要转义的字符,那么显然您应该确保发生这种情况。

      您在包含任何 qry 语言(如“OR 1 = 1”)的会话中存储的任何值基本上都归结为 IMO 应用程序设计不佳 - 会话中任何可能使您面临安全漏洞的值都是您自己的错 - 只需确保做不到。

      【讨论】:

      • 嗯?将用户提供的数据存储在会话中是非常常见的,如果在查询或其他地方使用时需要转义这些数据......?!
      猜你喜欢
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多