ทำอะไรได้
JavaScript obfuscator เขียนสคริปต์ใหม่ให้ยังทำงานเหมือนเดิมทุกประการ แต่คนอ่านและคัดลอกได้ยากขึ้นมาก ชื่อตัวแปรและฟังก์ชันจะกลายเป็น identifier ไร้ความหมายอย่าง _0x3f2a string literal ถูกย้ายไปอยู่ในตารางค้นหาที่เข้ารหัส และในระดับที่สูงขึ้น control flow จะถูกสลับและมีการผสม dead code เข้าไป
มีประโยชน์สำหรับเกมบนเบราว์เซอร์ เดโม วิดเจ็ต และการตรวจสอบไลเซนส์ที่คุณส่งเป็น JavaScript ธรรมดาและไม่อยากให้ถูกคัดลอกไปทั้งดุ้น
วิธีใช้งาน
- วาง JavaScript ของคุณหรือเปิดไฟล์
.js - เลือก ความเข้มข้น:
- ต่ำ เปลี่ยนชื่อภายในและย้ายสตริงไปไว้ในอาร์เรย์ค้นหา เอาต์พุตยังเร็วและค่อนข้างเล็ก
- กลาง เพิ่มการเข้ารหัสสตริง control-flow flattening และ dead code บางส่วน
- สูง ใช้ทุกอย่างเต็มกำลัง ผลลัพธ์อาจใหญ่ขึ้นหลายเท่าและช้าลงอย่างเห็นได้ชัด
- เปิด เปลี่ยนชื่อ global เฉพาะเมื่อไม่มีอะไรภายนอกสคริปต์อ้างถึงฟังก์ชันหรือตัวแปรระดับบนสุดของมัน
- ปิด เอาต์พุตบรรทัดเดียว หากต้องการให้ผลลัพธ์กระจายหลายบรรทัด
- คัดลอกหรือดาวน์โหลดโค้ดที่ obfuscate แล้ว และทดสอบก่อน deploy
ตัวอย่าง
ตัวอย่างนิยามฟังก์ชัน greet และตัวนับการเข้าชม หลัง obfuscate ที่ความเข้มข้นต่ำ โค้ดจะเป็นบรรทัดเดียวที่เต็มไปด้วยชื่อเลขฐานสิบหก แต่เมื่อรันก็ยังพิมพ์ Hello, Ada! You have visited 1 time(s).
Obfuscation กับ minification
Minification อย่างที่ตัวย่อ JavaScript และ CSS ทำ จะลบช่องว่างและย่อชื่อเพื่อให้ไฟล์เล็กลงและดาวน์โหลดเร็วขึ้น ส่วน obfuscation ไปทางตรงข้ามในเรื่องขนาด: จงใจเพิ่มความซับซ้อนเพื่อให้โค้ดเข้าใจยากขึ้น หลายโปรเจกต์ minify ทุกไฟล์ และ obfuscate เฉพาะไม่กี่ไฟล์ที่มีลอจิกที่ควรปกป้อง
ข้อจำกัด
การ obfuscate ปกป้องความลับไม่ได้ ทุกอย่างที่เบราว์เซอร์รันได้ ผู้ใช้ก็ตรวจดูได้ในที่สุด จึงควรเก็บ API key และกฎทางธุรกิจที่ต้องเป็นความลับไว้บนเซิร์ฟเวอร์ การตั้งค่าที่หนักยังทำให้โค้ดช้าลง จึงควรหลีกเลี่ยงใน loop ที่ทำงานบ่อยและหน้าที่ต้องการประสิทธิภาพสูง
คำถามที่พบบ่อย
› การ obfuscate เปลี่ยนการทำงานของโค้ดหรือไม่?
ไม่ สคริปต์ที่ obfuscate แล้วทำงานเหมือนต้นฉบับ เปลี่ยนแค่รูปแบบเท่านั้น ควรรันเทสต์กับ build ที่ obfuscate แล้วเสมอ เพราะโค้ดที่ตรวจซอร์สหรือชื่อฟังก์ชันของตัวเองอาจทำงานต่างไป
› โค้ดที่ obfuscate แล้วย้อนกลับได้หรือไม่?
ไม่ได้ทั้งหมด แต่คนที่ตั้งใจและมีเวลาก็ยังหาได้ว่ามันทำอะไร ให้ถือว่าการ obfuscate เป็นแค่เนินชะลอความเร็วสำหรับการคัดลอกแบบผ่าน ๆ ไม่ใช่ที่ซ่อนความลับอย่าง API key
› ควรเปิด เปลี่ยนชื่อ global เมื่อไร?
เฉพาะเมื่อสคริปต์สมบูรณ์ในตัวเอง การเปลี่ยนชื่อ global จะทำให้ attribute ของ HTML สคริปต์อื่น หรือเทสต์ที่เรียกฟังก์ชันระดับบนสุดของคุณตามชื่อพัง
› โค้ดของฉันถูกอัปโหลดหรือไม่?
ไม่ การ obfuscate ทำงานในเบราว์เซอร์ของคุณด้วยไลบรารีโอเพนซอร์ส javascript-obfuscator