【问题标题】:Is this SQL query safe from injection?此 SQL 查询是否可以防止注入?
【发布时间】:2012-06-17 17:17:31
【问题描述】:

下面的代码是用php编写的:

$user = addslashes($_POST['user']);
$pwd = addslashes($_POST['pwd']);

$query = "SELECT * FROM userdata WHERE UserName='$user' AND Password=PASSWORD('$pwd')";

然后查询将被发送到 mysql 我还有什么需要照顾的吗?

请指出。

【问题讨论】:

标签: php mysql sql sql-injection security


【解决方案1】:

不,这不安全,请在最低处使用mysql_real_escape_string

$user = mysql_real_escape_string($_POST['user']);
$pwd = mysql_real_escape_string($_POST['pwd']);

为了更好的安全性,请选择prepared statements

最佳选项:

你可能会问选择哪一个,看看:

【讨论】:

  • 感谢您的回复。抱歉,我不能接受所有回复作为答案。
【解决方案2】:

没有。

原因是,虽然单引号 ' 不是唯一破坏 sql 查询的字符,但引号是唯一被 addslashes() 转义的字符。

更好:使用mysql_real_escape_string

$user = mysql_real_escape_string($_POST['user'], $conn);
$pwd = mysql_real_escape_string($_POST['pwd'], $conn);

$query = "SELECT * FROM userdata WHERE UserName='$user' AND Password=PASSWORD('$pwd')";

最佳:使用 PDO 和准备好的语句

$stmt = $dbh->prepare("SELECT * FROM userdata WHERE UserName=':user' AND Password=PASSWORD(':pass')");
$stmt->bindParam(':user', $user);
$stmt->bindParam(':pass', $pass);

【讨论】:

  • mysql_* 函数已被弃用。不应在新代码中使用它们。
  • 这是有道理的。如果你能展示一个简单的例子来说明如何注入该代码可能会更好
  • 这是一个很好的例子,说明如何在 addlashes 运行后注入:shiflett.org/blog/2006/jan/…
【解决方案3】:

没有。您应该使用addslashes() 转义您的数据。这已经过时了。你应该是:

另外使用 MySQL 的 Password() 函数也很糟糕。使用带盐的哈希。 Bcrypt 是我的推荐。另外,请查看PHPass

【讨论】:

    【解决方案4】:

    防止 SQL 注入很容易:

    过滤您的数据。

    这不能过分强调。有了良好的数据过滤,大多数安全问题都会得到缓解,有些问题实际上已经消除。

    引用您的数据。

    如果您的数据库允许(MySQL 允许),请在 SQL 语句中的所有值周围加上单引号,无论数据类型如何。

    转义您的数据。

    有时有效数据会无意中干扰 SQL 语句本身的格式。使用mysql_escape_string() 或特定数据库的原生转义函数。如果没有特定的,addslashes() 是一个很好的最后手段。

    阅读更多:http://phpsec.org/projects/guide/3.html#3.2

    【讨论】:

      猜你喜欢
      • 2013-02-25
      • 1970-01-01
      • 2011-07-06
      • 2021-10-06
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      相关资源
      最近更新 更多