这种PDO查询是否受到SQL注入的保护?
这个问题在这里已经有了答案:
即使您使用过PDO
, SQL INjection
由于您尚未参数化查询,您的代码仍然容易受到SQL INjection
因此必须对查询进行参数化才能清除值。
$userid = $_GET['id'];
$query = "SELECT * FROM table WHERE userid=?";
$db->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
$action = $db->prepare($query);
$action->bindParam(1, $userid);
$action->execute();
第二种说法是不安全的。
相反,你应该这样做
$stmt = $db->prepare('SELECT * FROM table WHERE userid=:id');
$stmt->bindParam(':id', $userid);
$stmt->execute();
资源
它在技术上是安全的,因为用户不会影响$ userid,对吧? 说如果我错了这个。
你错了。 会话数据不在数据范围内,必须谨慎处理。 这是因为:
你可能期待一个整数值,所以做一个:
$userid = (int) $_SESSION['data']['id'];
尤其是当你直接将变量替换为你的SQL查询。
将来不要认为它是安全的。 考虑以安全的方式进行操作,以便即使您错过了其他层的某些内容(如通过会话输入),也不会中断应用程序中的数据流。
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
...
$userid = (int) $_SESSION['data']['id'];
...
$query = "SELECT column FROM table WHERE userid = ?";
$stmt = $pdo->prepare($query);
$stmt->bindParam(1, $userid);
$stmt->execute();
链接地址: http://www.djcxy.com/p/93733.html
上一篇: Is this kind of PDO query protected against SQL injection?
下一篇: Correct way to get allowed arguments from ArgumentParser