質問: 体系的に学ぶwebアプリケーション第2版の「4.3.2」章「クロスサイトスクリプティング(発展編)」を読み、勉強していたのですが、分からない部分があった為、質問させて貰いました。 分からなかった箇所は、script要素内のjavascriptの一部を動的生成する場合のXSS脆弱性についての部分です。 script要素内はタグや文字参照を解釈しないので、HTMLとしてのエスケープは必要なく、JavaScriptの文字列リテラルとしてのエスケープを行うが、それだけでは不十分だとの説明がありました。 以下は本に記載されていた、PHPから指定した文字列とその文字数を表示するスクリプトです。 ``` ``` このスクリプトはうまくいくように見えるが入力中に「」が含まれている場合、そこでJavascriptのソースの終端となるとの説明が記載されていました。しかし、次のページに、「HTML5の規格では、script要素内のデータには 「」が含まれている場合」も問題がないのではないかと思ってしまいました。また、「script要素内はタグを解釈しない」のであれば、そもそも「」が解釈されないのではないのでしょうか...? こちらの部分について、少し混乱してしまい分からなくなってしまった為、ご説明頂けましたら幸いです。 よろしくお願いします。
回答: 以下の箇所ですが... > > ここで、混乱してしまったのですが、「HTML5の規格では、script要素内のデータには「」が含まれている場合」も問題がないのではないかと思ってしまいました。 > > > 元々のscript要素が以下のようになっているとします。ZZZが外部入力です。 ``` ``` この ZZZZZZZ に ``` 前半の XXX... は途中でちぎれていて構文エラーになりますが、その場合でも2番目のscriptは実行されます...というのが攻撃の流れです。 ここで、「script要素内のデータには「 > すみません。確認の為、追加でお聞きしたい箇所があるのですが、は認識されてしまうため、が出現しないようにプログラマが気をつけなければならないといった理解で合っていますでしょうか...? > > また、がタグとして解釈されてしまうのは、javascriptの仕様なのでしょうか? > > > 違います。 「タグが解釈されない」というのは、< などが文字実体参照とてではなく、文字通りに扱われるという意味です。あるいは、という改行タグがあっても、改行という意味ではなく「」という文字列として扱われるという意味です。 そもそもの問題として、までで終わるわけです。これは正常な場合でもそうですよね。なので、ブラウザは、という文字列を探し、これらのタグに囲まれた範囲をJavaScriptの処理系に渡すわけです。タグの解釈をしないというのは、前述のようにを改行と解釈しない等のことであって、でscriptタグの終わりであることは識別しないことには、どこまでがscript要素かわからなくなります。