[英]Avoid SQL Injection in query using dynamically loaded tables and database names
我正在开发一个系统来以非常简单的方式管理数据库中的一些表。
系统首先使用Ajax加载用户可以查看和管理的数据库。 然后加载该数据库中的表,然后加载该表的数据。
我有这样的事情:
$.ajax({
url : "myUrl.php",
data : {
db : $dbSelector.val(),
table : tableToLoad
},
success : function (json) { /* Some cool stuff here */ }
});
而且我发现当参数是db名称,表或列时你不能使用参数化查询,所以我做不到:
<?php
$query = "SELECT * FROM :db.:table";
$st = $pdo->prepare($query);
$st->execute(
array(
"db"=>$db,
"table" => $table
)
);
$rows = $st->fetchAll(PDO::FETCH_OBJ);
我不能使用mysql_或mysqli_过滤因为我们没有安装它。
您可以使用:
$db = substr($dbh->quote($db), 1, -1);
或者只删除所有非字母数字字符:
$db = preg_replace('/\W/', '', $db);
接受的答案以及它所指的人工评论是一个致命的错误。
PDO :: quote与标识符无关,不应与它们一起使用。
从输出中删除引号使其实际上是对SQL注入开放。
巧妙的PDO::quote()
函数的要点是生成一个正确的字符串文字。 这意味着引用一个字符串并转义内部的引号,如果有的话。 与仅执行部分格式化的mysql_real_escape_string不同,这是处理字符串的唯一正确方法。
并且剥夺这个功能的一个职责实际上会导致一个简单的注入。
绝不应该使用PDO::quote()
来格式化标识符。 它们需要完全不同的格式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.