($=[$=[]][(__ =!$ $)[_=-~-~-~$] ({} $)[_/_]
($$=($_=!'' $)[_/_] $_[ $]) ])()[__[_/_] __
[_ ~$] $_[_] $$](_/_)
上記の段落に注意してくださいわかりにくいコードは自動的に折り返されず、3 行になります (もちろん、同じ行に書いても問題はありません)。ページを書いて実行すると(IEでは動かないそうです)、このコードの機能が
alert(1)
これはなぜでしょうか?このコードを分解して分析してみましょう。
$=[] // $ には空の配列が割り当てられるため、!$ の値は false になります。
__ = !$ $ // プラス記号は !$ と $ の両方を文字列に変換します。 __ の値は文字列 "false" になります
_ = -~-~-~$ // ここには ~ 演算子があり、-($ 1) を意味するため、-~$ の値は 1 になります。
これは推定できます:
(__ = !$ $ )[ _ = -~-~-~$] => ("false")[_] => ("false") => [3 ] = "s"
({} $)[_/_] => ("[オブジェクト オブジェクト]")[_/_] => ("[オブジェクト オブジェクト]")[1] => ; "[オブジェクト Object]"[1] = "o"
次に分割します $$=($_=!" $)[_/_] $_[$] :
$_=!" $ // !" には 2 つの単一引用符があることに注意してください。これは、空の文字列に対して NOT 演算が実行されるため、変数 $_ には文字列 "true" が割り当てられることを意味します。
$$=($_=!” $)[_/_] $_[ $] => $$ = ( “true”)[1] “true”[0] => “r” “t” = “rt”
つまり (__=!$ $)[_=-~-~-~$] ({} $)[_/_] ($$=($_= !" $)[_/_] $_[ $]) は "s" "o" "rt"、つまり "sort" です。
元の式は
($=[$=[]][(__=!$ $)[_= -~ -~-~$] ({} $)[_/_]
($$=($_=!'' $)[_/_] $_[ $])])()[ __[ _/_] __
[_ ~$] $_[_] $$](_/_)
は、
($=[[]]["sort"])()[__ [_/_] __
[_ ~$] $_[_] $$](_/_)
次に、[__[_/_] __[_] を見てみましょう~$] $_ [_] $$](_/_) なんだろう。
以前に学習しました:
__ = “false”
_ = 3
~$ = -1
$_ = “true”
$$ = “rt”
つまり [__[_/_] __[_ ~$] $_[_] $$](_/_) => ["false"[1] "false"[3-1] "true" [ 3] "rt"](3/3) => ["a" "l" "e" "rt"](1) => ["alert"](1)
つまり、元の式は式は最終的に次のように置き換えることができます:
($=[[]]["sort"])()["alert"](1)
このコードはどのように実行されるのでしょうか?それを段階的に分析してみましょう:
a = [[]] // 配列を作成します
b = a["sort"] // 配列のソートメソッドを取得します
c = b() / / 配列の sort メソッド sort メソッドを呼び出します。ここでは、 b() は window オブジェクトを返します
d = c["alert"] // window.alert メソッドを取得します
d(1) // window.alert を呼び出します方法。
この混乱した式の最終的な実行結果は window.alert(1) です。
詳細については、元の記事と Reddit のディスカッションを参照してください。
元のコメントの誰かが、JavaScript コードをさまざまな絵文字にエンコードできる、日本の開発者によって作成された小さなツールも投稿しました。
ちなみに、上記のコードは実行できません。 XSS 攻撃以外にはほとんど効果がありませんが、このコードを分析することでデータ型変換について学ぶことができ、また JavaScript の柔軟性を理解することもできます。
詳細なコード分析:
(
$ =[$=[]] // $ = []
[
(__= !$ $) // __ = "false"
[_=-~-~-~$ ] // _ = 3
// (__)[3] = "s"
({} $) // ({} $) = [オブジェクト オブジェクト]
[_/ _] / / _/_ = 1
// ([オブジェクト オブジェクト])[1] = "o"
($$ = //
($_=!'' $) // !'' $ = "真" ; $_ = "真"
[_/_] // _/_ = 1
// $_[1] = "r"
$_ [ $] // $ = 0; $_[0] = "t"
) // $$= "rt"
] // ["ソート"]
// [ ][" ソート"] = [].sort = function sort() { [ネイティブ コード] }
// $ = []["ソート"]
)() // ($)() = [オブジェクト ウィンドウ ]
[
__[_/_] // __ = "false"
// __[1] = "a"
__ [_ ~$]; //_ = 3; ~$ = -1; _ ~$ = 2
// __[2] = "l"
$_[_] // $_ = "true" ; _ = 3 ;
// $_[3] = "e"
$$ // $$ = "rt"
](_/_); 1
// window["alert"](1)
A few points to note here:
1. In JavaScript, $ and _ can be used as variable names
2. Functions can also be called like this: For example, [1,2,4,1,9,1] .sort() can be written as [1,2,4,1,9,1]["sort"]();
3. ~ Bitwise inversion of numbers
4. Different types in javascript Rules for using variables
5. The last method written for some native codes will return the window object when executed, such as
var s = [].sort; t=s(); then t is window