Xss can go through background. バックグラウンドを通過する Xss 攻撃に対処する場合、フィルタリング、特殊文字の検証、参照の検証などのフィルターを追加しますが、Dom 型の xss パラメータはバックグラウンドを通過しません。加工は駄目です。最初は、この例は不死身のように見えます。結局のところ、悪意のあるコードを生成する URL を入力し、それを自分のコンピューターで実行したままにしておくのは誰でしょうか? 本当の危険は、攻撃者が悪意のある URL を作成し、電子メールまたはソーシャル エンジニアリングを使用して被害者をだましてその URL へのリンクにアクセスさせることです。被害者がリンクをクリックすると、無意識のうちに脆弱な Web アプリケーションを介して悪意のあるコンテンツを自分のコンピュータに持ち込んでしまいます。脆弱な Web アプリケーションを盗み出すこのメカニズムは、反射型 XSS と呼ばれることがよくあります。個人的には、バックグラウンド検証を中心としたフロントエンド処理はだまされやすいと思いますが、この問題が発生するため、対処方法は次の 2 つです。
1. すべての入力を文字列に変換してエンコードする
encodeURI(inputValue); または innerText に変更
2. 入力文字列を特殊文字でフィルタリングし、特殊文字がある場合は無害な処理を実行する
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> Cross-Site Scripting: DOM </TITLE>
</HEAD>
<BODY>
<div id = 'demo'> </div>
<script>
//Dom型的xss参数的是不经过后台的,在后台处理没用
var inputValue = '<script>document.getElementById("demo").innerHTML = 222 <\/script>';
var element = document.getElementById('demo');
//方式一,全部转成字符串
//element.innerHTML = '1111' + encodeURI(inputValue);
//方式一,全部转成字符串
//element.innerText = '1111' + inputValue;
//方式二,只检测部分特殊情况的字符串
element.innerHTML = '1111' + filterJS(inputValue);
//js检测
function filterJS(param){
var filteArr = 'script,alert';
var splitArr = filteArr.split(',');
for(var i=0;i<splitArr.length;i++){
console.log(splitArr[i]);
if(param.indexOf(splitArr[i])== -1){
return param
}else{
return '*****';
}
}
}
</script>
</BODY>
</HTML>
3. ホワイトリスト
この方法でも十分安全ですが、実用的ではなく、B/S アーキテクチャ上、固定 IP セグメントでない限り、クライアントはホワイトリストの設定をあきらめる必要があります。