PDO准备好的语句是否足以阻止SQL注入?

PDO准备好的语句是否足以阻止SQL注入?

假设我有这样的代码:


$dbh = new PDO("blahblah");


$stmt = $dbh->prepare('SELECT * FROM users where username = :username');

$stmt->execute( array(':username' => $_REQUEST['username']) );

PDO文件说:


准备语句的参数不需要引用; 司机为你处理。


这真的是我需要做的就是避免SQL注入吗?这真的很容易吗?


如果它有所作为,你可以假设MySQL。另外,我真的只是对使用针对SQL注入的预处理语句感到好奇。在这种情况下,我不关心XSS或其他可能的漏洞。


呼啦一阵风
浏览 551回答 3
3回答

慕勒3428872

不,他们并不总是。这取决于您是否允许将用户输入放在查询本身中。例如:$dbh = new PDO("blahblah");$tableToUse = $_GET['userTable'];$stmt = $dbh->prepare('SELECT * FROM ' . $tableToUse . ' where username = :username');$stmt->execute( array(':username' => $_REQUEST['username']) );将容易受到SQL注入的攻击,并且在此示例中使用预准备语句将不起作用,因为用户输入用作标识符,而不是数据。这里正确的答案是使用某种过滤/验证,如:$dbh = new PDO("blahblah");$tableToUse = $_GET['userTable'];$allowedTables = array('users','admins','moderators');if (!in_array($tableToUse,$allowedTables))     $tableToUse = 'users';$stmt = $dbh->prepare('SELECT * FROM ' . $tableToUse . ' where username = :username');$stmt->execute( array(':username' => $_REQUEST['username']) );注意:您不能使用PDO绑定超出DDL(数据定义语言)的数据,即这不起作用:$stmt = $dbh->prepare('SELECT * FROM foo ORDER BY :userSuppliedData');以上不起作用的原因是因为DESC而ASC不是数据。PDO只能逃避数据。其次,你甚至不能'在它周围加上引号。允许用户选择排序的唯一方法是手动过滤并检查它是否为DESC或ASC。
打开App,查看更多内容
随时随地看视频慕课网APP