HTMLのscript要素の中身に於いて動的に生成した文字列のエスケープについて

213 views
Skip to first unread message

hoshikuzu stardust

unread,
Mar 6, 2011, 9:23:28 PM3/6/11
to 「体系的に学ぶ 安全なWebアプリケーションの作り方」サポートML
こんにちは。hoshikuzu|star_dustと申します。サポートMLに投稿してみたいと思います。
表題は『HTMLのscript要素の中身に於いて動的に生成した文字列のエスケープについて』ですが、意図しているのは以下のようなことです。
サーバからHTML4.01相当の文書を出力する際に、script要素が含まれ、その中身に於いて、以下のように、動的に書き出したいものとしま
す。
<script>
var strA;
// …
strA = "ここに動的に出力";
// …
</script>
動的に出力する部分に、"</" が含まれる可能性を考慮したいときに、エスケープする方式やいかに?という質問です。MLに参加なさっている人たちか
らもご意見を伺いたいのですが…
私の場合、スラッシュを【も】エスケープして、"\/" をしてしまうので、"</" は、"<\/"としています。
なにかまずいですかね? また、こんな方法があるよ、という別解があれば、ご教示願いたく、よろしくお願い申し上げます。
==
hoshikuzu | star_dust

徳丸浩

unread,
Mar 7, 2011, 8:33:37 PM3/7/11
to 「体系的に学ぶ 安全なWebアプリケーションの作り方」サポートML
hoshikuzu|star_dustさん、こんにちは。初投稿ありがとうございます。
さて、あまり堅いことは言いたくないのですが、このメーリングリストで扱い話題は以下のように、「体系的に学ぶ…」の記述に関する質問などに限らせてい
ただいております。

>このサイトでは、書籍「体系的に学ぶ 安全なWebアプリケーションの作り方」
>の記述内容やVMの動かし方に関する質問に限らせていただきます。

hoshikuzu|star_dustさんの投稿は、現在のままでは上記ガイドラインに違反しておりますが、以下のように、少し質問を変更すれば、こ
のメーリングリストで扱えるようになります。
本書P112以降では、JavaScriptの文字列リテラル生成方法として、以下の2種類を推奨しています。これ以外のリテラル生成方法についての質
問です…【以下略】

◆ Unicodeエスケープによる対策
◆ script要素の外部でパラメータを定義して、JavaScriptから参照する方法

 前者は、英数字(および「-」と「.」)以外の文字を全てUnicodeエスケープ(\uXXXX)するという方法です。いわゆる過剰エスケープの一
種ですね。後者は、JavaScriptの文字列リテラルを動的生成せず、hiddenパラメータなどで定義して、JavaScriptから参照する方
法です。IPAの「安全なウェブサイトの作り方」はこちらを推奨しています。

 私は元々過剰エスケープという奴が嫌いでして、その理由は「過剰」にすることで安全性が増すことの根拠が曖昧だからです。しかし、文字コードの問題
や、hoshikuzu|star_dustさんも指摘されているscript要素の終了に対する配慮を考えていくと煩雑になること、Unicodeに
よるエスケープが単純明快なルールで記述できるという理由から、JavaScriptの文字列リテラルに限っては過剰エスケープを(しぶしぶ)よしとし
ています。

hoshikuzu|star_dustさんのご質問ですが、

>私の場合、スラッシュを【も】エスケープして、"\/" をしてしまうので、"</" は、"<\/"としています。
>なにかまずいですかね?

これはミクロで見れば問題ありませんが、それでオッケーかというと、不安があるということですね。他の処理が全部正しければ問題ないと思いますが、U
+00A5が文字コード変換の結果 0x5C に変換されるような環境だと脆弱性になります。そのような例は、http://
www.slideshare.net/ockeghem/ss-5620584 のデモ6(スライド33から)に紹介しています。このケースに対して
は、自然な対策をとることができず、アドホックなことをやるくらいなら、英数字以外を\uXXXXでエスケープしてしまったほうがまだマシと思ってしま
うのですね。

>また、こんな方法があるよ、という別解があれば、ご教示願いたく、よろしくお願い申し上げます。

 これについては、本書記載の方法を参照ください。


On 3月7日, 午前11:23, hoshikuzu stardust <st4rd...@gmail.com> wrote:
> こんにちは。hoshikuzu|star_dustと申します。サポートMLに投稿してみたいと思います。
> 表題は『HTMLのscript要素の中身に於いて動的に生成した文字列のエスケープについて』ですが、意図しているのは以下のようなことです。
【後略】

hoshikuzu stardust

unread,
Mar 9, 2011, 1:30:12 AM3/9/11
to 「体系的に学ぶ 安全なWebアプリケーションの作り方」サポートML
hoshikuzu|star_dustと申します。
徳丸様、さっそくのご回答をありがとうございます。
丁寧な解説をいただきまして、まことに明快に理解させていただきました。
また、質問の仕方が不得手であったにも関わらず、私の言わんとするところを読み取っていただきまして、ありがとうございました。
===
・データベースとの文字エンコーディングの差異など、うっかりしがちであるとあらためて肝に命じました。(U+00A5の件)
・HTML中のscript要素であるならば「英数字以外を\uXXXXでエスケープ」という方法がやはり、最も堅牢であるのかなと、理解いたしまし
た。
==
御著書を再三精読させていただきたいと思いました。
このたびはありがとうございました。
==
hoshikuzu | star_dust
Reply all
Reply to author
Forward
0 new messages