ノードプラグイン用のXSSフィルターを作成していました。それをバイパスする方法はありますか?はいの場合、どうすればそれを防ぐことができますか?
function xSSFilter(str) {
return str
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
出力エンコーディングはコンテキスト固有です。この関数の出力をHTMLテキスト要素にのみ入れる場合-属性ではなく、スクリプト内の文字列(または他の場所)ではなく、CSSなどではなく-あなたかもしれません大丈夫。今のところ。あなたが他の文脈を目指しているなら、あなたは間違いなく大丈夫ではありません。以下はほんの一部です(これは包括的なリストではありません。包括的なリストを作成しようとしないでください。失敗する可能性が高く、次のECMAScriptまたはHTMLの更新を行わなくても、魔法のユニコーンが壊れます実行可能なブラックリスト)。
\
をフィルタリングしていません。これは、正当な文字列末尾の'
または"
をエスケープするために使用できます。攻撃者が同じ行の別の文字列を制御すると、その文字列はコードとして解釈されます。${
または}
をフィルタリングしていません。それらの間のテキストはコードとして扱われます。本当に安全にしたい場合は、すべての非英数字の出力エンコーディングを使用するか、少なくとも非英数字のホワイトリストを使用してエンコードしないでください(そしてそれを保守的にしてください)。特定のコンテキストまたは2つ(たとえば、HTMLテキストと非イベントHTML属性)に対してのみフィルターを使用している場合、フィルターする文字の特定の「ブラックリスト」を使用することで問題を回避できる可能性がありますが、他の場合よりもリスクが高くなります。仕方。
はい、作成したものはブラックリスト(使用できない文字)と呼ばれます。作成する必要があるのは、ホワイトリスト(つまり、使用が許可されている文字)です。
フィルターの回避は非常に一般的です OWASPフィルター評価チートシート を参照して、このフィルターをバイパスできる膨大な方法を確認してください。
また、これはJavaScriptなので、これはクライアント側にあると思います。クライアント側の検証は、ユーザーエクスペリエンスを向上させるためにのみ使用してください。検証には使用しないでください。サーバー側のスクリプトを検証に使用する必要があります。