PHP、PDO、MySQL - 多个 INSERT 易受注入攻击?
PHP, PDO, MySQL - Multiple INSERT vulnerable to injection?
在我的应用程序 (PHP) 中,我将从 API 中请求约 3000 行,并使用 PDO 驱动程序将它们插入 MySQL table 中。
虽然要插入的数据不是用户输入的,但我无法控制数据是如何传递给我的。
因为 ~3000 次插入尽可能快很重要,所以我想像这样使用多次插入 (?,?,?),(?,?,?),...
。
我想知道进行多次插入是否会对 MySQL 注入的漏洞产生影响?因为我'build'查询使用PHP代码。
我的'test'代码是:
<?php
class DBCon {
private static $instance = null;
private $db;
private function __construct() {
$this->db = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', '');
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public static function getDB() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance->db;
}
}
function createItems($array) {
$sql = 'INSERT INTO `table`(`text`, `int`, `bool`) VALUES ';
$insertArray = array();
foreach ($array as $arrayItem) {
$sql .= '(';
foreach ($arrayItem as $arrayItemItem) {
array_push($insertArray, $arrayItemItem);
$sql .= '?,';
}
$sql = rtrim($sql, ',');
$sql .= '),';
}
$sql = rtrim($sql, ',');
var_dump($sql);
var_dump($insertArray);
try {
$query = DBCon::getDB()->prepare($sql);
$query->execute($insertArray);
} catch (PDOException $e) {
echo '<br/><br/>query failure';
}
}
$array = array(array('a piece of text',123,0),array('a piece of text',123,0));
createItems($array);
$sql
包含:
index.php:36:string 'INSERT INTO `table`(`text`, `int`, `bool`) VALUES (?,?,?),(?,?,?)' (length=65)
$insertArray
包含:
index.php:37:
array (size=6)
0 => string 'a piece of text' (length=15)
1 => int 123
2 => int 0
3 => string 'a piece of text' (length=15)
4 => int 123
5 => int 0
只要这些值由 PDO 参数化查询处理,那么它将逃避任何尝试的注入。
如果您不使用 PDO,则需要确保所有数据都已正确转义,这是一项繁重的工作。
要查看 MySQL 服务器实际执行了哪些查询,您可以按照以下说明设置常规日志:
I was wondering whether doing a multiple insert has effect on the vulnerability for a MySQL injection? Because I 'build' the query using PHP code.
嗯,在现实生活中我们无法避免手动构建查询,因此动态创建一两个查询是可以的。在这种情况下,您必须遵循的唯一规则是 所有查询部分都必须在您的脚本中进行硬编码。
只要坚持下去,就永远不可能注射。
在您的情况下,所有查询部分都是硬编码的,因此此代码是安全的。
在我的应用程序 (PHP) 中,我将从 API 中请求约 3000 行,并使用 PDO 驱动程序将它们插入 MySQL table 中。
虽然要插入的数据不是用户输入的,但我无法控制数据是如何传递给我的。
因为 ~3000 次插入尽可能快很重要,所以我想像这样使用多次插入 (?,?,?),(?,?,?),...
。
我想知道进行多次插入是否会对 MySQL 注入的漏洞产生影响?因为我'build'查询使用PHP代码。
我的'test'代码是:
<?php
class DBCon {
private static $instance = null;
private $db;
private function __construct() {
$this->db = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', '');
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public static function getDB() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance->db;
}
}
function createItems($array) {
$sql = 'INSERT INTO `table`(`text`, `int`, `bool`) VALUES ';
$insertArray = array();
foreach ($array as $arrayItem) {
$sql .= '(';
foreach ($arrayItem as $arrayItemItem) {
array_push($insertArray, $arrayItemItem);
$sql .= '?,';
}
$sql = rtrim($sql, ',');
$sql .= '),';
}
$sql = rtrim($sql, ',');
var_dump($sql);
var_dump($insertArray);
try {
$query = DBCon::getDB()->prepare($sql);
$query->execute($insertArray);
} catch (PDOException $e) {
echo '<br/><br/>query failure';
}
}
$array = array(array('a piece of text',123,0),array('a piece of text',123,0));
createItems($array);
$sql
包含:
index.php:36:string 'INSERT INTO `table`(`text`, `int`, `bool`) VALUES (?,?,?),(?,?,?)' (length=65)
$insertArray
包含:
index.php:37:
array (size=6)
0 => string 'a piece of text' (length=15)
1 => int 123
2 => int 0
3 => string 'a piece of text' (length=15)
4 => int 123
5 => int 0
只要这些值由 PDO 参数化查询处理,那么它将逃避任何尝试的注入。
如果您不使用 PDO,则需要确保所有数据都已正确转义,这是一项繁重的工作。
要查看 MySQL 服务器实际执行了哪些查询,您可以按照以下说明设置常规日志:
I was wondering whether doing a multiple insert has effect on the vulnerability for a MySQL injection? Because I 'build' the query using PHP code.
嗯,在现实生活中我们无法避免手动构建查询,因此动态创建一两个查询是可以的。在这种情况下,您必须遵循的唯一规则是 所有查询部分都必须在您的脚本中进行硬编码。
只要坚持下去,就永远不可能注射。
在您的情况下,所有查询部分都是硬编码的,因此此代码是安全的。