JavaScript変態文法最速マスター

Java変態文法最速マスター - プログラマーの脳みそをリスペクト。
JavaScriptの変態文法・技法一覧です。あんまり使わないけど、知ってるとXSSとか攻撃したいのにWAFに妨害されるなど、いろいろ制約があるという場合に便利。

文字列の生成

引用符を使わずにさくっと文字列を作る。fromCharCode とか使ってもいいけどめんどくさいので、正規表現E4Xを利用。

alert( /string/.source );
alert( <>string</> )

空白文字を使わず記述

文脈上、スペースを書きたいけれどいろいろ制約があって書けない場合にはコメントで代替。実行するコードを作り上げてevalしてもいいけど大袈裟なので。

var/**/x=1;

*/ を含むコードブロックをコメントアウト

コードの塊りをコメントアウトしようと思って /* */ で囲むと、コード内に string.match( /abc*/ ); みたいなのがあって文法エラーになってしまうことがある。

/*
    var s = "abcd";
    if( s.match( /abc*/ ) ){
    }
*/

とりあえず、Firefoxの場合にはE4Xを使ってこの部分をただのリテラルXMLに押し込めることができる。もちろん、コード中に ]]> などが出てこないという前提で。

<><![CDATA[
    var s = "abcd";
    if( s.match( /abc*/ ) ){
    }
]]></>;

[ ] やピリオドを使わずにプロパティにアクセス

忘れられた構文 with を使うと、[ ] やピリオドを使わずにプロパティにアクセスできる。

with( document ){ alert( title ) }

記号だけでJavaScriptを書く。

jjencode - Encode any JavaScript program using only symbols を使うと任意のコードを記号だけのJavaScriptに変換できる。IEでは配列形式で文字列の一部を切り出すこと( "string"[ 1 ] == "t" )ができないので動かない。逆に記号なしでJSを書くというのは無理。

スラッシュを使わずに JavaScript を発動させる

XSSがあるので < や > は注入できるのに、/ は使えないという挙動をするサイトでは、終了要素なしの<script>を記述して onreadystatechange でスクリプトを動かす。IE限定。JSの話じゃないけど。

<script onreadystatechange=alert(1)>

もっとあるような気もするけど、ぱっと思い出せたのはこのくらい。あとは普段から sla.ckers.org とか見ておくと勉強になります。