MySQL REPLACE関数によるXSS攻撃を防ぐことはできますか?これは安全で許容できる方法ですか?
以下の例:
INSERT INTO persons(Name, Surname)
VALUES(REPLACE('<script>alert("Test")</script>', '<script>', ''), 'Sample Value');
これは、アプリケーションを保護するための本当に手ごわい方法です。このように入力を変換しようとしないでください。それはその目的において効果的であることから非常に長い道のりであり、保守可能/拡張可能ではなく、データを破壊することになります。
黄金律は入力の検証と出力のエスケープです。
一連のルールに対してコンテンツをチェックし、それを拒否して、非準拠データの問題を報告します。データがあるドメインから別のドメインに移動するときはいつでも(たとえば、PHPまたはpythonまたはPerlからmysqlに、またはプログラムからhtmlストリームに))、次のことを確認してください。データの表現は、それが注入されている構造からデータを分離します。
さまざまな言語やさまざまなターゲット(SQLやHTMLを含む)の出力をエスケープするための優れたライブラリがあります。それらを効果的に使用する方法を学ぶことから始めます。
いいえ、できません。できません。
これはまったく受け入れられない方法です。フィルタリングは非常に困難であり、自分で実装しようとすると間違いなく間違ってしまうでしょう。 HTML標準が拡張されると、フィルターも更新する必要があります(たとえば、HTML5は、JavaScriptコンテキストを入力するために使用できる新しいイベント属性の多くを追加しました)。
XSSに対する唯一の適切な防御策は、値を出力するときのコンテキスト依存のエンコーディングです。理想的には、テンプレートエンジンを使用してすべての出力を自動的にHTMLエンコードし、必要に応じてJavaScriptを手動でエンコードします。
フィルターをバイパスする簡単なPOCは次のとおりです。
<img src=x onerror=alert(1)>
XSSにつながる可能性のあるタグや属性は他にもたくさんあります。さらに、HTMLとCSSインジェクションについても心配する必要があります。
入力を取得するときに追加のフィルターが必要な場合-これは唯一の防御線であってはなりませんが、多層防御として推奨されます-を各入力フィールドに適合させる必要があります。名前は難しいので、フィルタリングしませんが、たとえばalphanumだけを期待していることがわかっている場合は、フィルタリングできます。 HTMLPurifierなどのライブラリを使用することもできます。ただし、ここでも、多層防御として、または解析するHTMLタグが本当に必要な場合にのみお勧めします(名前には当てはまりません。名前には'
または"
などの文字が含まれている場合がありますと<
ですが、ブラウザでHTMLとして解析しないでください)。
これは反映されたXSSを妨げません。これはすべての可能なスクリプトをフィルタリングするものではありません。
つまり、これはXSSを妨げません。