Hatena::ブログ(Diary)

hoshikuzu | star_dust の書斎 このページをアンテナに追加 RSSフィード Twitter

hoshikuzu|star_dustの日記について

書く内容の方針とかはフラフラしているのです。あまり考えていないかも知れません。面白いなぁと思うこと、大事なことだなぁと思うことを書いています。あんまり悲しいことは書かない主義。

 | 

2008-03-17

予約語なしにJavaScriptでいろいろしてみる 予約語なしにJavaScriptでいろいろしてみるを含むブックマーク 予約語なしにJavaScriptでいろいろしてみるのブックマークコメント

JavaScriptで。文字列'al%65rt%28%22Hello%20World%21%22%29'をunescape()してやってその後にeval()に通せば、結果として「Hello World!」とalertされると思います。

この操作を、安直なXSS対策ブラックリストにおけるヨワヨワな守備の回避を目的に、JavaScriptの予約語(と言ってよいですか?)を、陽には一切、使わずに行ってみるという試みです。以下。


<script>
(
  (21)['c' + 'onstructor']['co' + 'nstructor']
  (
    (
      (  
        (21)['con' + 'structor']['cons' + 'tructor']
        ('retur' + 'n unesc' + 'ape')
      )
      () 
    )  
    ('al%65' + 'rt%28%22Hello%20World%21%22%29')
  )
)
();
</script>

(21)というNumberオブジェクトのconstructorのそのまたconstructorは、Functionコンストラクタの機能をもっているようですので、工夫次第では実質的にevalの機能の一部を代行できます。unescape()など一般的な関数をも作成できます。その性質を使ってみました。このコードは手元のWindows上のOpera,Firefox,IEで確認しました。

XSS対策のブラックリストの使用にあたっては、充分なご考慮をいただきたいと思います。また、ホワイトリストの構築を是非、お勧めいたします。

すがりすがり 2008/03/20 16:01 不思議だったのですが、入れ子にする必要がどこにあったのでしょう?

hoshikuzuhoshikuzu 2008/03/26 12:50 コメントをありがとうございます。 
入れ子にする必要はありません。説明をする際に、Functionコンストラクタの二通りの使い方をともにあわせてごらんにいれる、という意図がありました。この他の使い方もあるのですが、手元のOperaなどで不都合が生じたためご案内しませんでした。
また、先日来、without quotes なJavaScriptの書き方についてチャレンジしていることもあり、そちら方面に移行しやすい記述方法を無意識的に心がけていた、ということもあります。 
※入れ子にしてしまうと、文字列の中に括弧がはいってしまい、構成しづらいのです。スペースをつっこむほうがはるかにラクチンであると感じているものですから・・・まぁコチラはどちらかというと裏話です。

 | 
最近のコメント