例:
$user_input = $_POST['input'];
'SELECT '.$user_input.' FROM table_name'
したがって、安全な(この例は明らかに安全ではありません)値に基づいてデータベース内の列を選択しています。これは実用的/許容可能なコードですか?
一見すると、このコードは有効で$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
.
string
SQL では、aを DBMS (MySQL など) に送信するだけです。このため、必要なものを作成string
して DBMS に送信できます。
結果の SQL クエリが有効であることを確認する必要があります。つまり、たとえば、列が存在し、無効な記号が表示されないことを意味します。