Viết code Javascript chỉ với dấu ngoặc và ký tự đặc biệt

Bạn không tin ư?
Bạn có thể thử demo dưới đây của mình:
Nhập vào chương trình javascript của bạn vào ô “Your JS Code”
Bấm Encode, bạn sẽ thấy dưới ô Encoded Code hiện ra code tương ứng (có thể rất dài)
Copy toàn bộ code trong ô Encoded Code, eval nó như dưới đây:
eval(your-encoded-code);
Ví dụ đoạn code gốc có thể là alert(‘hello world!‘) chẳng hạn.
Điều thần kỳ này từ đâu ra?
Thứ nhất, Javascript là ngôn ngữ thông dịch (interpreter language), mọi thứ đều được xem là string trước khi được thực thi. Bạn có thể thực thi một string một cách thoải mái thông qua function eval().
Thứ hai, vì mọi thứ được xem là string trước khi chạy, bạn hoàn toàn có thể share context giữa chương trình chính và string được thực thi. Ví dụ:
let x = 0;
let stCode = 'x++';
eval(stCode);
console.log(x); // x=1
Đây là đặc điểm cực kỳ hay mà rất ít ngôn ngữ khác làm được việc này.
Okay, giờ mình đi tìm hiểu sơ lược tại sao chương trình được viết toàn bằng dấu ngoặc mà vẫn chạy thong qua một số định nghĩa cơ bản của Javascript:
false \=> ![]
true \=> !false => !![] // phủ định của false là true :)
0 => +[] // dấu ‘+’ dùng để convert type thành số
1 => +!0 => +!+[] // trong javascript, 0 tương ứng với false và 1 tương ứng với true
2 => 1 + 1 => !+[]+!+[]
‘10’ => [1]+[0] => [+!+[]]+[+[]]
10 => +’10’ => +[+!+[]]+[+[]]
‘f’ => “false“[1] => ![][+[]]
‘a’ => “false“[1] => ![][+true] => ![][+!![]]
…
Còn rất nhiều nữa… mà bạn có thể tự suy ra :) hoặc tham khảo ở JSFuck.
Cuối cùng thì cái trò này có ích lợi gì?
Thực ra, đây là một cách cực kỳ hay để che giấu code của bạn. Có một kỹ thuật gọi là ofuscator để che giấu source code bạn có thể đọc thêm, và dường như ngôn ngữ nào cũng cần kỹ thuật này. Tuy nhiên, giấu cỡ này thì quá đỉnh, quá an tâm, chỉ sợ browser nó nghi ngờ chính đoạn code của bạn mà không chịu execute thì phiền.
Mà tại sao browser nó từ chối chạy những đoạn code này? Lý do là vì rõ ràng bạn sẽ dễ dàng giấu mã độc để thực thi trên máy người khác bằng các cuộc tấn công Cross-site Scripting XSS. Mình không khuyến khích các bạn làm điều này nghen!
Subscribe to my newsletter
Read articles from Legos Light directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
