ユーザーに出力できる場合は、悪意のある可能性のあるユーザーがコードに HTML タグを含めないようにする必要があります。たとえば、その投稿にscript
タグを含めることができた場合、投稿を読んでいるユーザーにとって非常に危険になる可能性があります. これを防ぐには、次を使用しますhtmlentities
。
$clean_data = htmlentities($_POST['data']);
そうすれば、<script>
タグが翻訳<script>
されて、ブラウザで表示されたときにユーザーに害が及ぶことはありません。
さて、私の投稿をデータベースに保存したい場合は、SQL インジェクションに注意する必要があります。そのクエリで私の投稿を保存しているとしましょう(はい、mysql_*
関数は非推奨であるため使用しないでください。ただし、それはアイデアを説明するためだけです):
mysql_query($db, "INSERT INTO posts(data) values('$clean_data');");
いいですね ?まあ、私が嫌なら、その投稿を含めようとします:
test'); DELETE FROM posts; SELECT * FROM posts WHERE data = '
あなたのMySQLが得るものは
INSERT INTO posts(data) values('test'); DELETE FROM posts; SELECT * FROM posts WHERE data = '');
ああ。したがって、基本的に、ユーザーが投稿に引用符や二重引用符を含めないようにする必要があります。より正確には、それらをエスケープする必要があります。それは実際に使用しているライブラリに依存しますが、私が使用した廃止されたライブラリでは、次のように記述されます。
$really_clean_data = mysql_real_escape_string($db, $clean_data);
mysql_query($db, "INSERT INTO posts(data) values('$really_clean_data');");
したがって、上記の悪意のある投稿により、MySQL は受信するようになります。
INSERT INTO posts(data) values('test\'); DELETE FROM posts; SELECT * FROM posts WHERE data = \'');
さて、MySQL にとっては、そのINSERT INTO posts(data) values('test'); DELETE FROM posts; SELECT * FROM posts WHERE data = '');
部分全体が正しい文字列であるため、何が起こるかはあなたが望んでいることです。
基本的に、ほとんどすべての場合にこれで十分です。ユーザー データをインタープリター (Web ブラウザー、SQL エンジン、またはその他多くのもの) にフィードするときは、そのデータをクリーニングする必要があることを覚えておいてください。使用しているライブラリに付属しています。