原标题:从宽字节注入认识PDO的原理和正确使用
前言
随着数据库参数化查询的方式越来越普遍,SQL注入漏洞较之于以前也大大减少,而PDO作为php中最典型的预编译查询方式,使用越来越广泛。
众所周知,PDO是php中防止SQL注入最好的方式,但并不是100%杜绝SQL注入的方式,关键还要看如何使用。
之前在一篇文章中了解到PDO场景下参数可控导致的多句执行等问题(https://xz.aliyun.com/t/3950)于是对PDO场景下的SQL注入又进行了一些探究。
PDO查询语句可控存在的安全问题:
首先在本地新建一个库和表,随便写点东西。
然后写一个test.php,用PDO进行简单的查询:
getMessage; } if(isset($_GET['id'])) { $id = $_GET['id']; } else { $id=1; } $query = "select balabala from table1 where 1=?"; echo "id:".$id."
"; $row = $db->prepare($query); $row->bindParam(1,$id); $row->execute; $result = $row->fetch(PDO::FETCH_ASSOC); if($result) { echo "结果为:"; print_r($result); echo "
"; }
将输入的内容和得到的结果打印在页面上:
PDO与安全问题相关的主要的设置有下面三个:
PDO::ATTR_EMULATE_PREPARES
PDO::ATTR_ERRMODE
PDO::MYSQL_ATTR_MULTI_STATEMENTS