【问题标题】:Is it better to use mysqli_real_escape_string (with mysqli) or placeholders (with PDO)? [duplicate]使用 mysqli_real_escape_string(使用 mysqli)还是占位符(使用 PDO)更好? [复制]
【发布时间】:2015-01-05 11:39:35
【问题描述】:

鉴于此代码:

mysqli_set_charset('utf8');

$id = mysqli_real_escape_string($_GET['id']);

$result = mysqli_query($con,"SELECT * FROM post WHERE id_post = '$id'");

if (mysqli_num_rows($result) == 0) {
    header('Location: 404.php');
    die();
} else {
    // Continue...
}

还有这个:

$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);

// New PDO...

$Ps = $Pdo->prepare('SELECT * FROM post WHERE id_post = :id');

$Ps->execute(array(':id', $id));

if ($Ps->rowCount() == 0) {
    header('Location: 404.php');
    die();
} else {
    // Continue...
}

是否有防止 SQL 注入的最佳选择或等效方法?

【问题讨论】:

  • 在示例中是 PDO 之一。然而 mysqli 也支持准备好的/参数化的语句。 php.net/manual/en/mysqli.quickstart.prepared-statements.php
  • 例子是苹果到橘子。通常,它们都可以被认为是安全的 if 使用占位符,而前者根本无法做到这一点。现在,如果询问mysqli_real_escape_string 占位符的使用(可能在内部使用)..
  • @Philibobby,他们是不同的问题
  • 我从未如此深入地研究过这一点,但考虑到两者都提供了一种达到目的的方法,它主要归结为您更喜欢使用哪一种。
  • @Jhecht 观察到我不会雇用一个仍然坚持使用mysqli_real_escape_string而不是占位符的开发人员..当然。

标签: php mysql pdo mysqli sql-injection


【解决方案1】:

第二个选项是要走的路。使用 mysql_real_escape_string() 为使用一些奇异的多字节字符的 sql 注入留出了一些空间。参考:SQL injection that gets around mysql_real_escape_string()

或者,您可以将准备好的语句与 mysqli 一起使用

【讨论】:

  • 我只是好奇,有没有办法做mysql注入,如果在查询之前检查了$_GET['id']?例如。预期值为数字,代码检查 $id 是否为数字/数值?谢谢!
  • 我不知道mysqli_real_escape_stringnot mysql_real_escape_string)上的任何当前漏洞,假设它与相同的联系。确保为此类声明提供参考。 (此外,占位符可能通过转义在内部实现 - 但它们仍然是一种从根本上更好的方法。)
  • 你在说什么? mysql 真正的转义字符串可能不安全,请阅读该问题
  • 通过这个答案,同样的问题也适用于 PDO,带有仿真 - 感谢您提供链接,这是一个很好的阅读。
猜你喜欢
  • 2013-03-25
  • 2016-09-11
  • 2011-07-12
  • 2010-12-19
  • 2011-06-26
  • 2012-05-23
  • 2023-03-29
  • 2011-11-01
  • 2011-08-02
相关资源
最近更新 更多