0

I'm developing a system to manage in a very simple way some tables in the database.

The system first loads with Ajax the databases the user can see and manage. Then load the tables in that database and then load the data for that table.

I have something like this:

$.ajax({
    url : "myUrl.php",
    data : {
        db : $dbSelector.val(),
        table : tableToLoad
    },
    success : function (json) { /* Some cool stuff here */ }
});

And I've found you cannot use parameterized queries when the parameters are the db name, tables or columns, so I cannot do:

<?php
$query = "SELECT * FROM :db.:table";
$st = $pdo->prepare($query);
$st->execute(
    array(
        "db"=>$db, 
        "table" => $table
    )
);
$rows = $st->fetchAll(PDO::FETCH_OBJ);

I cannot use mysql_ or mysqli_ filtering cause we don't have it installed.

4

2 回答 2

1

您可以使用:

$db = substr($dbh->quote($db), 1, -1);

或者只是删除所有非字母数字字符:

$db = preg_replace('/\W/', '', $db);
于 2013-05-08T18:16:16.717 回答
1

接受的答案以及它所指的手动注释是一个致命的错误。

PDO::quote 与标识符无关,根本不应该与它们一起使用。
从其输出中删除引号使其实际上对 SQL 注入开放。

巧妙PDO::quote()功能的关键在于生成正确的字符串文字。这意味着引用一个字符串并转义里面的引号(如果有的话)。与只进行部分格式化的 mysql_real_escape_string 不同,这是处理字符串的唯一正确方法。
剥夺此功能的一项职责实际上将导致简单的注入。

PDO::quote()永远不应该用于格式化标识符。它们需要完全不同的格式。

于 2013-05-08T23:11:54.037 回答