sql >> データベース >  >> RDS >> Mysql

これらの2つの機能は、消毒には行き過ぎですか?

    正直なところ、これらの関数の作成者は、XSSおよびSQLインジェクションが何であるか、または使用されている関数が正確に何をするのかを知らないと思います。

    2つの奇妙なことに名前を付けるだけです:

    さらに:一般に、XSSを保護する関数は、SQLインジェクションを保護するのには適していません。その逆も同様です。各言語とコンテキストには、注意が必要な独自の特殊文字があるためです。

    私のアドバイスは、コードインジェクションが可能である理由と方法、およびそれから保護する方法を学ぶことです。使用している言語、特に特殊文字とそれらを回避する方法を学びます。

    編集 次にいくつかの(おそらく奇妙な)例を示します。 onclickのJavaScriptコードで使用するURIのパスセグメントとして使用する必要のある値をユーザーが入力できるようにするとします。 属性値。したがって、言語コンテキストは次のようになります。

    • HTML属性値
      • JavaScript文字列
        • URIパスセグメント

    さらに楽しくするために、この入力値をデータベースに保存しています。

    この入力値をデータベースに正しく格納するには、その値をデータベース言語(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(&quot;http://example.com/&quot;%22bar%2Fbaz%22&quot;&quot;)" …
    

    しかし、これらのコンテキストでこれらすべての機能を使用することはやり過ぎではありません。コンテキストには同様の特殊文字が含まれている場合がありますが、エスケープシーケンスが異なるためです。 URIにはいわゆるパーセントエンコーディングがあり、JavaScriptには \"のようなエスケープシーケンスがあります HTMLには&quot;のような文字参照があります 。そして、これらの関数の1つだけを使用しないと、コンテキストを壊すことができます。



    1. perfを使用したPostgreSQLのトレース

    2. MySQLでINT(1)とTINYINT(1)を使用することに違いはありますか?

    3. SQL Server LocalDBの自動シャットダウンを防ぐ方法は?

    4. テーブル式の基礎、パート11 –ビュー、変更に関する考慮事項