Ben*_*ing 6 php mysql pdo sql-injection
PHP的PDO允许一次执行多个查询,可以通过query()方法或作为预准备语句执行.以下两个示例均有效:
// Two SQL queries
$query = "SELECT * FROM table; DROP table;"
// Execute via query()
$pdo->query($query);
// Execute via prepared statement
$stmt = $pdo->prepare($query);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
有没有办法一次将PDO限制为单个查询,就像mysql_query()函数一样?
这是对这个问题的最新答案.
防止多查询执行的旧方法是禁用模拟准备,但这仅适用于该PDO::prepare()方法.在PHP的新版本(> = 21年5月5日和> = 5.6.5),一个新的常数已被引入到禁用在两个这种多查询执行PDO::prepare()和PDO::query().(通常不会在补丁版本中添加常量,但这是由于此功能带来的Drupal SQL注入攻击的严重性而完成的).
新常数PDO::MYSQL_ATTR_MULTI_STATEMENTS和必须要在对象创建设置(作为第四个参数的构造函数PDO) -设置其与预先存在的对象上PDO::setAttribute()是行不通的.
$pdo = new PDO('mysql:host=_;dbname=_', '', '', [PDO::MYSQL_ATTR_MULTI_STATEMENTS => false]);
Run Code Online (Sandbox Code Playgroud)
嗯,有一种方法可以通过禁用PDO中预准备语句的模拟来实现这一点,以使其使用本机mysql API(服务器端预处理语句不支持多查询):
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Run Code Online (Sandbox Code Playgroud)
但是,此选项的一个缺点是查询缓存丢失.