深刻なセキュリティ問題を回避するためにあなたがしなければならない2つの非常に重要なことがあります。
-
SQLクエリに入力する前に、ユーザー入力をエスケープする必要があります。エスケープとは、
'
などのすべての特殊文字をエスケープすることを意味します;幸いなことに、すでに自動的に実行する関数があります。 mysql_real_escape_string 。ユーザー入力をエスケープしないと、厄介なことが起こる可能性があります。クエリが
INSERT INTO userdata VALUES ('$user_data')
であると想像してください。 。ここで、ユーザーが'; DROP DATABASE userdata;
。エスケープしないと、クエリは次のようになります。
INSERT INTO userdata VALUES (''; DROP DATABASE userdata;')
。ご想像のとおり、これは良くありません。複数のステートメントを有効にしている場合は、データベースに別れを告げることができます。これはSQLインジェクションと呼ばれます 攻撃。 -
変数をユーザーに出力するときは、HTMLの特殊文字をHTMLエンティティに適切に置き換える必要もあります。幸いにも、それを行う関数があります: htmlspecialchars() 。
<
などの特殊なHTML文字を変換します<
へ 。これはしばしば過小評価されている問題のようですが、実際には非常に深刻です。
$user_data
の場合を想像してみてください<script>SomeNastyScript()</script>
が含まれています 。ユーザーのブラウザに存在する脆弱性を悪用したり、HTTPOnly以外のCookie(保存されたパスワードを含む可能性があります)を攻撃者に送信したり、ユーザーをだまして、 DOM(javascriptで可能)、または他の多くの悪いこと。これはXSSと呼ばれます (クロスサイトスクリプティング)。
ショートバージョン
-
mysql_real_escape_string
を呼び出します SQLクエリに挿入する前に文字列を変更します(ただし、echo
を実行する場合は変更しません) -
htmlspecialchars
を呼び出す 文字列をユーザーに表示する前に(ただし、データベースに配置するときはそうではありません)。