0

データベース内のいくつかのテーブルを非常に簡単な方法で管理するシステムを開発しています。

システムはまず、ユーザーが表示および管理できるデータベースを Ajax で読み込みます。次に、そのデータベースにテーブルをロードしてから、そのテーブルのデータをロードします。

私はこのようなものを持っています:

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

また、パラメーターがデータベース名、テーブル、または列である場合、パラメーター化されたクエリを使用できないことがわかったので、次のことはできません。

<?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_ フィルタリングがインストールされていないため、使用できません。

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 とは異なり、これは文字列を処理する唯一の適切な方法です。
そして、この関数をその義務の 1 つから奪うと、実際には単純なインジェクションが発生します。

PDO::quote()識別子をフォーマットするために使用しないでください。まったく異なるフォーマットが必要です。

于 2013-05-08T23:11:54.037 に答える