![]() |
AntiBrowserCrasherTop / AntiBrowserCrasher 最終更新: 2015-07-07 (火) 17:58:10 (2998d) |
file:// を使うことにより、FDD/CD-ROMへのアクセスを繰り返すブラクラ。
<img src="file:///A:/test1.txt"> <img src="file:///A:/test2.txt"> <img src="file:///A:/test3.txt">
回避するには、fileスキームを無効化すればよい。
[Patterns] Name = "Kill file scheme [2007/06/01]" Active = TRUE URL = "$TYPE(htm)" Limit = 256 Match = "(<[^>]++\s)\0(href=|src=)$AV((file://*)\1)(^(^[ >]))" Replace = "\0title="Killed \1""
<table> の入れ子の階層が深くなると、ブラウザの描画速度が低下する。
特に、古いブラウザではその傾向が顕著のようだ。(現在のブラウザは描画速度が上がっているので、まず影響しない)
以下のフィルタは、<table> が入れ子で5つ以上存在するとき、<table> を削除した上で、以降の接続を切断する。
(TOC氏のフィルタ「Kill Excessively Nested Tables (2002/05/14)」からアイデアを得て、作成した。
「Kill Excessively Nested Tables」は正常に動作しない事があるようだ。)
[Patterns] Name = "Kill Excessively Inner Nested Tables [2007/06/01]" Active = TRUE URL = "$TYPE(htm)" Limit = 2048 Match = "<table[ >]$INEST(<table[ >]," "*<table[ >](((^</table>)?)++<table[ >])+{3}*" ",</table>)" "$STOP()" Replace = "\k\r\n<p><strong style="color: red">[Killed excessively nested tables]</strong></p>"
メールソフトを起動するタグを多数記述し、メールソフトを多重起動させるブラクラ。
(現在のブラウザは対策済みなので、よほど古いブラウザを使っているのでなければ、mailtoストームに遭遇することはないだろう)
<img src="mailto:user1@hogehoge.com"> <img src="mailto:user2@hogehoge.com"> <img src="mailto:user3@hogehoge.com">
mailtoストームを回避するには、mailtoの「正しい使い方」と「正しくない使い方」を見分ける必要がある。
HTML4.01の文法上、mailtoスキームが使われる可能性があるのは、次の3通り。(メールアドレスは適当)
<a href="mailto:user@hogehoge.com">user@hogehoge.com</a> <link rev="made" href="mailto:user@hogehoge.com"> <form method="post" action="mailto:user@hogehoge.com" enctype="multipart/form-data"></form>
それ以外の使い方では、mailtoストームが発生する可能性がある。
そこで、「a要素, link要素 以外の要素」の「href属性 / src属性」にmailtoが含まれている時に、その属性を削除することで回避する。
(action属性はユーザーが操作しない限り、作用しないので考慮しなかった。)
[Patterns] Name = "Kill wicked mailto [2007/06/01]" Active = TRUE URL = "$TYPE(htm)" Limit = 256 Match = "(<(^a\s|link\s)[^>]++\s)\0(href=|src=)$AV((mailto:*)\1)(^(^[ >]))" Replace = "\0title="Killed \1""
要素自体を削除しても良かったが、終了タグへの対応が面倒なので、タグは残しつつ、無効化した。
IE7にて、new ActiveXObject('htmlfile')で作成したHTMLDocumentに、<iframe src="~#アンカー名"></iframe>のように、srcにアンカー付きのURIを指定したIFRAME要素を書込むと、何故かブラウザのタブが一杯開いて収集がつかなくなる、という訳のわからない現象に遭遇
http://furyu.tea-nifty.com/annex/2008/04/jscriptactivexo_874a.html
IE8でも発生
ぼくはまちちゃん!(Hatena) - IEを華麗に撃墜する一行 TR/HTML.Crashie.E
http://pc11.2ch.net/test/read.cgi/win/1175925637/559-
559 :名無し~3.EXE :sage :2007/08/07(火) 11:54:49 ID:baaR9pRV はまちちゃんのクラッシュバグを、自分が解析した結果は以下の通りです。 IE 6/7 は、table 要素内に (tbody | tr) 要素がコードに存在しない場合、 自動的に tbody 要素を補います。しかし、この様にフォーム要素が 隣接している場合、フォーム要素の後の不正な位置に tbody 要素を補い、 その副産物として不正な空要素が作成されます。 サンプル1 : 不正な空要素が table 要素と フォーム要素の間に生成されている。 <head><script> function funcA(){ var elms = document.getElementsByTagName('*'); var tagStr = ''; for (i=0 ; i < elms.length; i++) { window.alert(elms[i].tagName+' ['+elms[i].tagName.length+']'); tagStr += elms[i].tagName + '\n'; } window.alert(tagStr+'this page used '+i+' elements'); } </script></head><body onload="funcA()"><table><input> 560 :名無し~3.EXE :sage :2007/08/07(火) 11:56:32 ID:baaR9pRV 上のサンプルで実験した結果、TABLE要素の次に不正な空要素が存在する事が 確認できます。従って、次のコード(サンプル 2)でもクラッシュするはずです。 サンプル 2: TABLE要素の次に隣接する不正な空要素でクラッシュする <style>table *{position:relative}</style><table><input> なお、クラッシュは、以下の要素の組み合わせでも発生します。 table + (legend | button | input | textarea | select | input) 561 :名無し~3.EXE :sage :2007/08/07(火) 12:22:27 ID:baaR9pRV 実際にサンプル2で使われている例は、隣接セレクタでなく子孫セレクタでしたね。 ちなみに、サンプル 1 の forループの内側末行に if(elms[i].tagName.length == 0) { if(window.confirm('clash style setting ?')) { elms[i].style.position = 'relative';} } を挿入して、position = 'relative'にする事でもクラッシュが確認できます。
<img src="file:///c:/con/con/con.con">
などでWindows9x系が停止する con以外にもnulなどでも動く
JavaScript は暗号化も可能なので、Proxomitron で書き換えるだけでは完全な無効化はできない
JavaScript は暗号化も可能なので、Proxomitron で書き換えるだけでは完全な無効化はできない
eval() で実行する場合は、window.eval = function(){} のように代入可能なので、書き換え可能だが、
onmouseover などにセットされたり、innerHTML, appendChild などで script タグを挿入し実行された場合、対処不能(?)
for、while、setInterval、setTimeout、再帰関数 などで無限にループさせる事が可能
例
<script type="text/javascript"> for(;;); </script>
<script type="text/javascript"> while(1); </script>
※setInterval では100%化は出来ない様子
防御法
例
<script type="text/javascript"> for(;;) alert(); </script>
<script type="text/javascript"> while(1) alert(); </script>
<script type="text/javascript"> setInterval('alert()', 1) </script>
防御法
[Patterns] Name = "user.js" Active = FALSE Limit = 256 Match = "<start>" Replace = "<script type="text/javascript" src="http://local.ptron/user.js" charset="Shift_JIS"></script>"
[Patterns] Name = "user.js" Active = TRUE Limit = 256 Match = "(^(^<(/head|script|body)*>))$STOP()" Replace = "<script type="text/javascript" src="http://local.ptron/user.js" charset="Shift_JIS"></script>"
頭から 200Byte 内に <(html|head|title|body|script|img|table|pre|plaintext)> がある。
または、
頭から 200Byte 内に <(html|head|title|body|script|img|table|pre|plaintext)? があり、そのあと範囲未指定で *> にマッチする場合、
例えば text/plain で 拡張子も .txt であっても、HTMLとして処理してしまう。
Proxomitronなどでブラクラを潰したい場合は、この動作に気をつける必要がある。
※IE6で確認 大文字小文字区別せず 確認した全てのタグ:http://www.htmq.com/html/index.shtml 最終確認日:2007/08/11
対策
[HTTP headers] In = TRUE Out = FALSE Key = "X-Content-Type-Options: nosniff (in) for MSIE" Match = "^?" Replace = "nosniff"