4

私はphpでPDOを使用しているため、準備されたステートメントを使用してテーブル名または列名をエスケープできません。以下は、自分で実装するための簡単な方法でしょうか。

$tn = str_replace('`', '', $_REQUEST['tn']);
$column = str_replace('`', '', $_REQUEST['column']);
$sql = "SELECT * FROM `tn ` WHERE `column` = 23";
print_r(
    $pdo->query($sql)->fetchAll()
);

それとも、これを攻撃できる手段がまだありますか?

4

1 に答える 1

4

特定のデータベース テーブルで有効な列をデータベースに問い合わせることで、動的ホワイト リストを使用できます。追加のSQLクエリですが、安全性は良好です。

select COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_SCHEMA = :databaseName
  and TABLE_NAME = :tableName

その結果を取得してから、すべての動的列名が結果セットに含まれていることを確認してください。

ビューは に含まれていると思いますINFORMATION_SCHEMA.COLUMNSので、すべて単純に機能するはずです。

次に、動的SQLを組み立てるときに、検証された列名の周りにバッククォートを使用します(純粋にASCII列名を使用すると仮定します。そうしないと、追加の考慮事項が生じる可能性があります)。

于 2012-10-15T01:10:15.200 に答える