0

例:

$user_input = $_POST['input'];
'SELECT '.$user_input.' FROM table_name'

したがって、安全な(この例は明らかに安全ではありません)値に基づいてデータベース内の列を選択しています。これは実用的/許容可能なコードですか?

4

2 に答える 2

1

一見すると、このコードは有効で$user_inputあり、有効な列名である必要があります。つまり、列名が存在する必要があり、特殊文字や予約語などが含まれていてはなりません (エスケープされていない限り)。

ただし、あなたが言ったように、このコードは安全ではありませんが、クエリを安全に構築し、PDO または MySQLi を使用することを計画している限り (非推奨のmysql_*関数はありません...)、問題ありません。廃止予定の関数 (廃止予定の を含む) を使用しない例が必要な場合は、mysql_real_escape_string提供します。

このコードが安全ではないことを知っているとおっしゃいましたが、興味がある方のために別の例を示します。コメントとこの質問で説明したように、この入力:

$user_input = '; DELETE FROM table_name ; *';
'SELECT '.$user_input.' FROM table_name'

テーブルの内容全体を削除しますtable_name。このコードは構文エラーを発生させますが、MySQL はそれを実行し続けるため、効果的にtable_name.

于 2012-08-08T21:47:50.820 に答える
1

stringSQL では、aを DBMS (MySQL など) に送信するだけです。このため、必要なものを作成stringして DBMS に送信できます。

結果の SQL クエリが有効であることを確認する必要があります。つまり、たとえば、列が存在し、無効な記号が表示されないことを意味します。

于 2012-08-08T21:44:00.047 に答える