正直なところ、これらの関数の作成者は、XSSおよびSQLインジェクションが何であるか、または使用されている関数が正確に何をするのかを知らないと思います。
2つの奇妙なことに名前を付けるだけです:
-
ストリップスラッシュ
を使用するmysql_real_escape_string
の後mysql_real_escape_string
によって追加されたスラッシュを削除します 。 -
htmlentities
チャットアクターを置き換えます<
および>
strip_tags
で使用されます タグを識別するため。
さらに:一般に、XSSを保護する関数は、SQLインジェクションを保護するのには適していません。その逆も同様です。各言語とコンテキストには、注意が必要な独自の特殊文字があるためです。
私のアドバイスは、コードインジェクションが可能である理由と方法、およびそれから保護する方法を学ぶことです。使用している言語、特に特殊文字とそれらを回避する方法を学びます。
編集 次にいくつかの(おそらく奇妙な)例を示します。 onclick
のJavaScriptコードで使用するURIのパスセグメントとして使用する必要のある値をユーザーが入力できるようにするとします。 属性値。したがって、言語コンテキストは次のようになります。
- HTML属性値
- JavaScript文字列
- URIパスセグメント
- JavaScript文字列
さらに楽しくするために、この入力値をデータベースに保存しています。
この入力値をデータベースに正しく格納するには、その値をデータベース言語(SQLなど)に挿入しようとしているコンテキストに適切なエンコーディングを使用する必要があります。残りは(まだ)重要ではありません。これをSQL文字列宣言に挿入するため、コンテキスト特殊文字は、そのコンテキストを変更できるようにする文字です。文字列宣言に関しては、これらの文字は(特に)"
です。 、'
、および \
エスケープする必要のある文字。しかし、すでに述べたように、準備されたステートメントはあなたのためにすべての仕事をするので、それらを使用してください。
データベースに値が設定されたので、それらを適切に出力します。ここでは、最も内側のコンテキストから最も外側のコンテキストに進み、各コンテキストに適切なエンコーディングを適用します。
- URIパスセグメントの場合 コンテキスト(少なくとも)そのコンテキストを変更できるようにするすべての文字をエスケープする必要があります。この場合、
/
(現在のパスセグメントを残す)、?
、および#
(両方ともURIパスコンテキストを残します)。rawurlencode
を使用できます このために。 - JavaScript文字列の場合
"
を処理する必要があるコンテキスト 、'
、および\
。json_encode
を使用できます このため(利用可能な場合)。 - HTML属性値の場合
&
の面倒を見る必要があります 、"コード> 、
'
、および<
。
htmlspecialchars
を使用できます このために。
今すべて一緒に:
'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'
ここで、 $ row ['user-input']
"bar / baz"
です 出力は次のとおりです。
… onclick="window.open("http://example.com/"%22bar%2Fbaz%22"")" …
しかし、これらのコンテキストでこれらすべての機能を使用することはやり過ぎではありません。コンテキストには同様の特殊文字が含まれている場合がありますが、エスケープシーケンスが異なるためです。 URIにはいわゆるパーセントエンコーディングがあり、JavaScriptには \"
のようなエスケープシーケンスがあります HTMLには&quot;
のような文字参照があります 。そして、これらの関数の1つだけを使用しないと、コンテキストを壊すことができます。