Кусок кода для менеджера продукта (!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]] + ( {} + [])[[~!+[]]

JavaScript

Дайте продакт-менеджеру кусок кода и пусть вставит в консоль

(!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]]

На самом деле этот код мойколлегаМне его прислали, я присмотрелся и там должна быть дырка, вот я и собирался взломать.

На самом деле в этом задействовано не более трех точек знаний.

  • преобразование типа данных
  • побитовые операции (побитовое отрицание)
  • приоритет оператора

Перед разбором рекомендую прочитать несколько статей

Сначала мы разделяем код

(!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]]
+
({} + [])[[~!+[]] * ~+[]]

Проще говоря(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))

вставить(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]

Это то, что наш интерфейс пытался сказать вам

Справочная статья

ПримечаниеОбида на продакт-менеджера в тексте только за эффект от текста 😅 Фронтенд и продукт - это семья, которая любит друг друга 😆

исходный адрес гитхаба