为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼啦一阵风 2019-05-24 16:02:41
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或其他可能的漏洞。
查看完整描述

3 回答

?
慕勒3428872

TA贡献1848条经验 获得超5个赞

不,他们并不总是。


这取决于您是否允许将用户输入放在查询本身中。例如:


$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。


查看完整回答
反对 回复 2019-05-24
  • 3 回答
  • 0 关注
  • 532 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信