繁体   English   中英

使用动态加载的表和数据库名称在查询中避免SQL注入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM