体系的に学ぶwebアプリケーション第2版の「4.3.2」章「クロスサイトスクリプティング(発展編)」を読み、勉強していたのですが、分からない部分があった為、質問させて貰いました。
分からなかった箇所は、script要素内のjavascriptの一部を動的生成する場合のXSS脆弱性についての部分です。
script要素内はタグや文字参照を解釈しないので、HTMLとしてのエスケープは必要なく、JavaScriptの文字列リテラルとしてのエスケープを行うが、それだけでは不十分だとの説明がありました。
以下は本に記載されていた、PHPから指定した文字列とその文字数を表示するスクリプトです。
php
1<?php 2session_start(); 3function escape_js($s) { 4 return mb_ereg_replace('([\\\'"])','\\1',$s); 5} 6?> 7<body> 8 <div id="name"></div> 9 <script> 10 var div = document.getElementById('name'); 11 var txt = '<?php echo escape_js($_GET['name']); ?>'; 12 div.textContent = txt + 'の文字数は' + txt.length + '文字です'; 13 </script> 14</body>
このスクリプトはうまくいくように見えるが入力中に「</script>」が含まれている場合、そこでJavascriptのソースの終端となるとの説明が記載されていました。しかし、次のページに、「HTML5の規格では、script要素内のデータには
「</script」という文字の並びは出現できないことになっている」とも書かれていました。
ここで、混乱してしまったのですが、「HTML5の規格では、script要素内のデータには「</script」という文字の並びは出現できないことになっている」としたら、「入力中に「</script>」が含まれている場合」も問題がないのではないかと思ってしまいました。また、「script要素内はタグを解釈しない」のであれば、そもそも「</script>」が解釈されないのではないのでしょうか...?
こちらの部分について、少し混乱してしまい分からなくなってしまった為、ご説明頂けましたら幸いです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/29 00:34 編集
2019/09/29 00:42
2019/09/29 01:00