0

将来のクエリに使用される SQL スクリプトを生成するために後で使用されるコンテンツを表すデータベースにテキストを保存しています。これが危険であることはわかっていますが、この機能が必要であり、それを取得する方法が他にわかりません。

ユーザーが提供したコンテンツを最初に保存するときに、prepare ステートメントを使用しますが、これは誤った安心感を与えていると感じています。後で値を取得して将来のクエリで使用すると、危険なユーザー入力は元の形式で返されます。

1 つの戦略は、コンテンツを使用する将来のすべてのクエリに対して、準備済みステートメント、pdo::quote() などで適切なアクションを実行することです。以下の例では、これを行っておらず、潜在的に危険な SQL をpdo::query() であり、いつかこれを忘れるのではないかと心配しています。

代わりに、$_POST からデータを取得したらすぐにアクションを実行することを考えています。潜在的なコンテンツを一度だけ削除し、心配することなく保存および取得する方法はありますか? そうでない場合、 $_POST から受け取った許容値は整数、日付、日時、または数値であり、データがこれらのデータ型のいずれかに該当することを保証できると思います。

だから、繰り返します....

  1. 後でクエリの SQL として使用されるコンテンツを保存するにはどうすればよいですか?
  2. エスケープするのではなく、SQL インジェクションとして使用できるコンテンツを完全に削除するにはどうすればよいですか?

ありがとう

$user_input=$_POST['suspect_user_input']; //Acceptable values are an integer, a date, a datetime, or a number
$sql='INSERT INTO table1 (id,user_input) VALUES(123,?)';
$stmt = db::db()->prepare($sql);
$stmt->execute(array($user_input));
unset($user_input);
...
...
$sql='SELECT user_input FROM table1 WHERE id=123';
$stmt = db::db()->query($sql);
$user_input=$stmt->fetchColumn();
$partial_select_statement='SELECT * FROM '.$user_input;
$sql='INSERT INTO table2 (id,partial_select_statement) VALUES(321,'.$partial_select_statement.')';
$stmt = db::db()->exec($sql);
unset($partial_select_statement);
...
...
$sql='SELECT partial_select_statement FROM table2 WHERE id=321';
$stmt = db::db()->query($sql);
$partial_select_statement=$stmt->fetchColumn();
$new_sql=$partial_select_statement.' WHERE foo=bar';
$stmt = db::db()->query($new_sql);
$rs=$stmt->fetch();
4

0 に答える 0