【发布时间】:2016-11-11 08:38:51
【问题描述】:
在我的脚本中是否有一些东西可能会逃逸,或者它对大多数 SQL 注入安全吗?按照我的理解,如果您将查询作为准备好的参数传递,那么查询的构建方式并不重要,对吧?
Edit2:我编辑了代码以反映绑定 $_POST 值的建议
$q = $pdo->prepare('SHOW COLUMNS FROM my_table');
$q->execute();
$data = $q->fetchAll(PDO::FETCH_ASSOC);
$key = array();
foreach ($data as $word){
array_push($key,$word['Field']);
}
$sqlSub= "INSERT INTO other_table(";
$n = 0;
foreach ($key as $index){
$sqlSub = $sqlSub.$index.", ";
$n = $n + 1;
}
$sqlSub = $sqlSub.") VALUES (";
for ($i=1; $i<$n;$i++){
$sqlSub = $sqlSub."?, ";
}
$sqlSub = $sqlSub.."?)";
$keyValues = array();
for($i=0;i<n;$i++){
array_push($keyValues,$_POST[$key[$i]]);
}
$q->$pdo->prepare($sqlSub);
q->execute($keyValues);
编辑:这是建议编辑后最终查询的样子
INSERT INTO other_table($key[0],...,$key[n]) VALUES (?,...,nth-?);
【问题讨论】:
-
if you pass query as prepared argument, it does not matter how the query was build...错误。是的,这仍然是脆弱的。事实上,您就像没有准备查询一样容易受到攻击。使这种 sql 注入安全的方法不仅仅是准备查询,而是使用占位符准备查询并将值绑定到这些占位符。 -
不!如果你不使用绑定你的值,你就不安全。
-
不,如果你想让它安全地使用“描述”或“解释”数组键获取表中的列列表,如果它们是表单输入的名称,例如,使用列列表,您可以交叉检查它们。然后对值使用准备好的语句,对键使用白名单。
-
@aynber 但他们正在使用准备好的语句。他们只是使用连接,而不是与之绑定。如果不绑定,预处理语句并不比标准 sql 更安全。
-
@JonathanKuhn 我修改了我的评论。因为对我来说,准备好的陈述意味着具有约束力,但这只是我训练大脑的方式。
标签: php mysql security sql-injection