Дайте продакт-менеджеру кусок кода и пусть вставит в консоль
(!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]]
На самом деле этот код мойколлегаМне его прислали, я присмотрелся и там должна быть дырка, вот я и собирался взломать.
На самом деле в этом задействовано не более трех точек знаний.
- преобразование типа данных
- побитовые операции (побитовое отрицание)
- приоритет оператора
Перед разбором рекомендую прочитать несколько статей
- Преобразование типа данных: автоматическое преобразование
- Побитовый оператор: ~ (побитовое отрицание)
- приоритет оператора
Сначала мы разделяем код
(!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]]
+
({} + [])[[~!+[]] * ~+[]]
Проще говоря(A)[B] + (C)[D]
Первый взгляд на А!(~+[]) + {}
+[] -(数据类型转换)-> 0
~+[] --> ~0 -(位运算)-> -1
!(~+[]) --> !(-1) -(类型转换)-> false
(!(~+[]) + {}) --> false + {} -(类型转换)-> 'false[object Object]'
давайте посмотрим на Б--[~+""][+[]]*[~+[]] + ~~!+[]
[~+""] --> [~0] --> [-1]
+[] --> 0
--[~+""][+[]] --> --[-1][0] --> --(-1) --> -2
[~+[]] --> [~0] --> [-1]
~~!+[] --> ~~!0 --> ~~true --> ~-2 -> 1
B --> -2 * [-1] + 1 --> 2 + 1 --> 3
Так(A)[B] --> 'false[object Object]'[3] --> 's'
давайте посмотрим на С({} + [])
здесь{}
На самом деле это блок кода
Таким образом, это эквивалентно+[]
который[object Object]
см. D снова[~!+[]] * ~+[]
[~!+[]] --> [~!0] --> [!1] --> -2
~+[] --> ~0 --> -1
D -> -2 * -1 --> 2
так(C)[D] --> '[object Object]'[2] --> 'b'
Так
(!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]]
--> (A)[B] + (C)[D)
--> 's' + 'b'
--> 'sb'
Спасибо за просмотр 😄
Готово к отправке менеджерам по продукту
Позвольте ему открыть Chrome (Windows: F12, Mac: Command + Option + (J или i))
вставить(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
Это то, что наш интерфейс пытался сказать вам
Справочная статья
- Преобразование типа данных: автоматическое преобразование
- Побитовый оператор: ~ (побитовое отрицание)
- приоритет оператора
ПримечаниеОбида на продакт-менеджера в тексте только за эффект от текста 😅 Фронтенд и продукт - это семья, которая любит друг друга 😆