【发布时间】: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