ฉันจะทำให้ JavaScript ยุ่งเหยิง (ป้องกัน) ได้อย่างไร [ปิด]


714

ฉันต้องการสร้างแอปพลิเคชัน JavaScript ที่ไม่ใช่โอเพ่นซอร์สดังนั้นฉันต้องการเรียนรู้วิธีทำให้โค้ด JS ของฉันงงงวย? เป็นไปได้ไหม


15
ฉันสนใจที่จะฟังเหตุผลที่คุณพยายามทำให้งงงวยรหัสอาจให้บริบทที่จำเป็นบางอย่างเพื่อให้คำตอบที่เป็นประโยชน์
JohnFx

45
วิธีเดียวที่จะให้สิ่งที่แท้จริงลับคือการไม่ส่งไปยังลูกค้า หากพวกเขาไม่มีมันก็ไม่สามารถอ่านได้ การส่งแบบเข้ารหัสเป็นการขอให้มีปัญหาอยู่ในมือของคนไม่กี่คนที่สนใจจริง ๆ และคนอื่น ๆ จะไม่แหย่แม้ว่าคุณจะส่งมันอย่างชัดเจน (cf DRM)
Donal Fellows


8
การทำให้รหัสของคุณยุ่งเหยิงไม่ใช่ความคิดที่ดี ผู้ใช้ที่ถูกต้องตามกฎหมายจะไม่สะดวกเท่านั้น (เช่นเมื่อพวกเขาต้องการแก้ไขข้อบกพร่อง) และไม่ทำอะไรเลยที่จะ "ปกป้อง" จากผู้ที่มีแรงจูงใจ (การเงิน) เพื่อทำวิศวกรรมย้อนกลับ โดยพื้นฐานแล้วเป็นไปไม่ได้ที่จะป้องกันการย้อนกลับของรหัส Javascript
Sven Slootweg

14
การโต้เถียงที่จะไม่ทำให้สับสนดูเหมือนจะมีข้อบกพร่องสำหรับฉัน หากคุณไม่คิดว่าผู้ใช้ของคุณอาจแก้ไข / รายงานข้อบกพร่องคุณควรทำเช่นนั้น มันสามารถลดเวลาในการโหลดโดยการลดขนาด มันจะไม่หยุดแฮ็กเกอร์ที่ทุ่มเทจริงๆ แต่มันจะทำให้เขา / เธอทำงานช้าลงและมันจะหยุดความพยายามในการแฮ็กที่ไม่ได้ตั้งใจ มันง่ายมากที่จะทำและมีเครื่องมือมากมาย (ดูคำตอบอื่น ๆ ) ฉันพูดได้อย่างแน่นอนเพราะมันมีข้อดีอยู่เกือบตลอดเวลา แต่อย่าคาดหวังว่ามันจะนำความปลอดภัยมาให้ ถ้าพวกเขาต้องการ วิธีเดียวที่จะทำเช่นนี้คือการรักษาด้านรหัสเซิร์ฟเวอร์และใช้ ajax
Benjamin

คำตอบ:


405

obfuscation:

ลองยูอิคอมเพรสเซอร์ เป็นเครื่องมือที่ได้รับความนิยมมากสร้างปรับปรุงและดูแลโดยทีม Yahoo UI

คุณอาจใช้:

UPDATE: คำถามนี้ถูกถามมานานกว่า 10 ปีแล้วและ YUI ไม่ได้รับการดูแลรักษาอีกต่อไป Google Closure Compiler ยังคงใช้งานอยู่และ UglifyJS สามารถเรียกใช้แบบโลคัลผ่านตัวจัดการแพ็กเกจโหนด:npm install -g uglify-js

ข้อมูลสตริงส่วนบุคคล:

การรักษาค่าสตริงให้เป็นแบบส่วนตัวนั้นเป็นข้อกังวลที่แตกต่างกันและการทำให้งงงวยจะไม่เกิดประโยชน์มากนัก แน่นอนโดยบรรจุภัณฑ์ขึ้นแหล่งที่มาของคุณให้เป็นที่อ่านไม่ออกระเบียบ minified คุณมีรุ่นไฟของการรักษาความปลอดภัยผ่านความสับสน ส่วนใหญ่เป็นผู้ใช้ของคุณที่กำลังดูแหล่งที่มาและค่าสตริงในไคลเอนต์มีไว้สำหรับการใช้งานของพวกเขาเพื่อให้การเรียงลำดับของค่าสตริงส่วนตัวไม่จำเป็นต้องมักจะ

หากคุณมีค่าที่คุณไม่เคยต้องการให้ผู้ใช้เห็นคุณจะมีตัวเลือกสองทาง ก่อนอื่นคุณสามารถทำการเข้ารหัสบางชนิดซึ่งถูกถอดรหัสเมื่อโหลดหน้าเว็บ นั่นอาจเป็นหนึ่งในตัวเลือกที่ปลอดภัยที่สุด แต่ก็มีงานจำนวนมากซึ่งอาจไม่จำเป็น คุณอาจจะ base64 เข้ารหัสค่าสตริงบางส่วนและที่จะง่าย .. แต่คนที่ต้องการค่าสตริงเหล่านั้นจริงๆอาจได้อย่างง่ายดายถอดรหัสพวกเขา การเข้ารหัสเป็นวิธีเดียวที่จะป้องกันไม่ให้ใครก็ตามเข้าถึงข้อมูลของคุณอย่างแท้จริงและคนส่วนใหญ่พบว่ามีความปลอดภัยมากกว่าที่พวกเขาต้องการ

sidenote:

การทำให้งงงวยใน Javascript นั้นเป็นที่ทราบกันดีว่าทำให้เกิดข้อบกพร่องบางอย่าง ผู้ obfuscators เริ่มดีขึ้นเล็กน้อยเกี่ยวกับเรื่องนี้ แต่หลายชุดตัดสินใจว่าพวกเขาเห็นประโยชน์เพียงพอจากการลดขนาดและการgzippingและการประหยัดที่เพิ่มขึ้นของการทำให้งงไม่ได้คุ้มค่ากับปัญหาเสมอไป หากคุณพยายามปกป้องแหล่งที่มาของคุณคุณอาจจะตัดสินใจว่ามันคุ้มค่ากับเวลาของคุณเพียงเพื่อให้โค้ดอ่านยากขึ้น JSMinเป็นทางเลือกที่ดี


32
ฉันต้องการเพิ่มว่าการทำการเข้ารหัสแบบ base64 จะไม่เป็นประโยชน์ต่อความปลอดภัยเนื่องจากเป็นกระบวนการที่สามารถย้อนกลับได้เล็กน้อย แม้แต่การเข้ารหัสมันก็ไม่ได้ช่วยอะไรเลยถ้ามันถูกถอดรหัสฝั่งไคลเอ็นต์ วิธีเดียวที่จะทำให้แน่ใจว่าการรักษาความปลอดภัยของสตริงคือการให้ลูกค้าเห็นสตริงที่เข้ารหัสเท่านั้นและมันถูกส่งผ่านไปยัง
Claudiu

16
เซิร์ฟเวอร์สำหรับการประมวลผลเพิ่มเติม
Claudiu

9
FYI คอมเพรสเซอร์ YUI ออนไลน์อาจจะพบได้ที่นี่: refresh-sf.com/yui
mtness

7
การเข้ารหัสค่าสตริงจะมีประโยชน์เพียงเล็กน้อยมากกว่า base64 ที่เข้ารหัสหากจำเป็นต้องถอดรหัสโดยเบราว์เซอร์เพื่อใช้งาน เหตุผลก็คือคุณจะต้องให้คีย์การเข้ารหัสของเบราว์เซอร์ด้วยและทุกสิ่งที่เบราว์เซอร์สามารถทำได้ก็คือผู้ใช้สามารถทำได้เช่นกัน
Ben

9
เมื่อฉันทำการลดขนาดด้วย YUI Compressor ฉันแน่ใจว่าใช้วิธีการลดขนาด "ปลอดภัย" นั่นคือรักษาเซมิโคลอน--preserve-semiไว้ การเขียนซ้ำตัวแปรส่วนตัวไปที่ a, b, c ฯลฯ มักจะปลอดภัย สิ่งที่ผมทำก็คือทำให้ minifier --line-break 0ใส่ตัวแบ่งบรรทัดหลังจากแต่ละลำไส้ใหญ่กึ่งในรหัส จากนั้นในการผลิตหากข้อผิดพลาดฉันมีบรรทัดอ้างอิงที่ถูกต้องในการทำงานและสามารถค้นหารหัสนั้นในสำเนาการพัฒนาของฉัน มิฉะนั้นคุณจะต้องจบลงด้วยข้อผิดพลาดในรหัสจำนวนมากและไม่รู้ว่าข้อผิดพลาดนั้นอยู่ที่ไหน
zuallauz

136

ฉันประหลาดใจที่ไม่มีใครได้กล่าวถึงของ Google ปิดคอมไพเลอร์ มันไม่เพียงแค่ลดขนาด / บีบอัดเท่านั้น แต่ยังวิเคราะห์เพื่อค้นหาและลบรหัสที่ไม่ได้ใช้และเขียนใหม่เพื่อการลดขนาดสูงสุด นอกจากนี้ยังสามารถทำการตรวจสอบประเภทและจะเตือนเกี่ยวกับข้อผิดพลาดทางไวยากรณ์

JQuery เพิ่งเปลี่ยนจาก YUI Compresser เป็น Off Compiler และเห็น " การปรับปรุงที่มั่นคง "


60
ใช่ แต่ไม่นานมานี้พวกเขาออกจากการปิดคอมไพเลอร์และกำลังใช้ UglifyJS ตอนนี้ รหัส JQuery มีข้อผิดพลาดหลังจากบีบอัดด้วยคอมไพเลอร์ปิด
Chielus

ฉันต้องการที่จะทราบว่าถ้าคุณทำงานกับเชิงมุม เครื่องมือนี้ใช้งานไม่ได้เพราะการฉีดขึ้นต่อกันและการเปลี่ยนชื่อข้อโต้แย้งเว้นแต่จะมีช่องทำเครื่องหมายที่ฉันไม่เห็น
iConnor

1
เครื่องมือที่มีประโยชน์ แต่ไม่ได้ทำให้งงงวยซึ่งอาจเป็นสาเหตุที่ไม่มีใครพูดถึงมัน
Madbreaks

1
@Madbreaks พร้อมการเพิ่มประสิทธิภาพขั้นสูง ( developers.google.com/closure/compiler/docs/api-tutorial3 ) มันจะลดขนาดของรหัสไปยังจุดที่ทำให้งงงวย ตัวแปรสามารถเปลี่ยนชื่อสำหรับความกะทัดรัดเช่น
Jason Hall

Google ไม่ได้เป็นตัวเลือกสำหรับการรักษาความปลอดภัย
Fillipo Sniper

121

การทำให้งงงวยไม่สามารถทำงานได้จริงๆ สำหรับผู้ที่ต้องการได้รับรหัสของคุณจริงๆมันเป็นเพียงการเพิ่มความเร็ว ยิ่งไปกว่านั้นยังช่วยให้ผู้ใช้ของคุณไม่สามารถแก้ไขข้อบกพร่อง (และจัดส่งการแก้ไขกลับมาให้คุณ) และทำให้การวินิจฉัยปัญหาในฟิลด์นั้นยากขึ้น มันเสียเวลาและเงินของคุณ

พูดคุยกับนักกฎหมายเกี่ยวกับกฎหมายทรัพย์สินทางปัญญาและตัวเลือกทางกฎหมายของคุณคืออะไร "โอเพ่นซอร์ส"ไม่ได้หมายความว่า "ผู้คนสามารถอ่านต้นฉบับ" ได้ แทนโอเพนซอร์สเป็นรูปแบบสิทธิ์การใช้งานเฉพาะซึ่งอนุญาตให้ใช้และแก้ไขรหัสของคุณได้อย่างอิสระ หากคุณไม่ให้ใบอนุญาตดังกล่าวคนที่คัดลอกรหัสของคุณจะละเมิดและ (ในส่วนใหญ่ของโลก) คุณมีตัวเลือกทางกฎหมายเพื่อหยุดพวกเขา

วิธีเดียวที่คุณสามารถป้องกันรหัสของคุณได้คือไม่ส่ง ย้ายรหัสเซิร์ฟเวอร์ที่สำคัญและให้รหัส Javascript สาธารณะของคุณเรียกใช้ Ajax

ดูคำตอบแบบเต็มของฉันเกี่ยวกับผู้ปิดบังที่นี่


14
+1 ในทนายความ แต่นั่นอาจไม่ทำงานในประเทศ / เขตอำนาจศาลอื่น ๆ
jmort253

16
ทนายความอาจสร้างค่าใช้จ่าย / ปัญหามากกว่ารหัสที่หายไปให้คิดอย่างระมัดระวังและจัดการเงินจำนวนมากเพื่อว่าจ้างทนายความ !!
andora

11
-1: ฉันเชื่อว่าการหาทนายความที่เข้าใจ JavaScript จะยาก ... ไม่ต้องพูดถึงค่าธรรมเนียมและระยะเวลาที่ต้องใช้ในการค้นหา "ผู้ฝ่าฝืน" มีใครบางคนที่ละเมิดใบอนุญาตที่ฝังอยู่ในไฟล์ HTML / JavaScript จริง ๆ หรือไม่หากเขาไม่เคยเซ็นสัญญาอะไรเลย +1 สำหรับการโทร AJAX
Alerty

12
@Alerty 1) สิทธิ์การใช้งานเบื้องต้นเกี่ยวกับการอนุญาตให้ใช้เนื้อหาที่มีลิขสิทธิ์ คุณมีสิทธิ์ใช้งานเพียงเล็กน้อยโดยไม่ต้องมีใบอนุญาต คุณไม่ต้องลงชื่อเพื่อรับสิทธิ์ ใบอนุญาตแตกต่างจากสัญญา 2a) เนื่องจากคำถามเกี่ยวกับคนที่คัดลอกและใช้ HTML / Javascript โดยไม่ได้รับอนุญาตใบอนุญาตจะไม่ถูก "ฝัง" จึงเป็นสิ่งที่ถูกต้อง 2b) คุณมีสิทธิ์เพียงเล็กน้อยในการใช้เนื้อหาที่มีลิขสิทธิ์ของบุคคลอื่นโดยไม่มีใบอนุญาต 3) นักกฎหมายไม่จำเป็นต้องเข้าใจ Javascript เพียงกฎหมายทรัพย์สินทางปัญญา
Schwern

4
@Alerty อย่าป้าน นี่คือการลงโทษผู้ที่คัดลอกไฟล์เพื่อใช้ในเว็บไซต์ของตนเองโดยไม่ได้รับอนุญาต สิ่งที่คุณกำลังพูดถึงคือสัญญาไม่ใช่ใบอนุญาต สัญญาต้องการความยินยอมซึ่งกันและกันและเป็นการให้และรับ ใบอนุญาตให้สิทธิ์แก่คุณในการใช้ทรัพย์สินทางปัญญา สิทธิ์ใช้งานเป็นวิธีหนึ่ง (เจ้าของอนุญาตให้คุณทำสิ่งต่าง ๆ ) คุณไม่จำเป็นต้องลงชื่อเพราะคุณไม่ได้ให้อะไรเลย "ข้อตกลงสิทธิ์การใช้งานซอฟต์แวร์" หลายสัญญาเป็นจริงเพราะพวกเขาไปไกลกว่าการอนุญาตให้ใช้สิทธิ์ในทรัพย์สินและบางครั้งก็เป็นสิ่งที่ไร้สาระเช่นสิทธิที่จะฟ้อง
Schwern

49

คุณสามารถทำให้งงแหล่ง javascript ทุกอย่างที่คุณต้องการ แต่มันจะเป็น reverse-engineerable เพียงแค่อาศัยการกำหนด source code ทั้งหมดให้ทำงานบนเครื่องไคลเอนต์จริง ๆ ... ตัวเลือกที่ดีที่สุดที่ฉันคิดคือการประมวลผลของคุณเสร็จสิ้นแล้ว ด้วยรหัสฝั่งเซิร์ฟเวอร์และรหัสไคลเอนต์จาวาสคริปต์ทั้งหมดก็คือส่งคำขอสำหรับการประมวลผลไปยังเซิร์ฟเวอร์เอง มิฉะนั้นทุกคนจะสามารถติดตามการดำเนินการทั้งหมดที่รหัสกำลังทำอยู่

มีคนพูดถึง base64 เพื่อให้สายปลอดภัย นี่เป็นความคิดที่แย่มาก Base64 สามารถจดจำได้ทันทีโดยประเภทของผู้ที่ต้องการย้อนกลับสร้างรหัสของคุณ สิ่งแรกที่พวกเขาจะทำคือยกเลิกการเข้ารหัสและดูว่ามันคืออะไร


45
คำตอบที่พบบ่อยที่สุดคือ "ฉันจะทำให้ Javascript ของฉันงงงวยได้อย่างไร" คือ "คุณไม่ควรกังวลเกี่ยวกับสิ่งนั้นเพราะมีคนไม่สามารถทำให้งงงวยได้" นี่ไม่ใช่คำตอบจริงๆ
Travis Wilson

2
@Vivek: ช้าไปหน่อย แต่สิ่งที่ฉันหมายถึงจริงๆคือ "รหัสฝั่งเซิร์ฟเวอร์" เป็นไปได้ที่จะเรียกใช้จาวาสคริปต์ไม่ได้อยู่ในเบราว์เซอร์เพียงบนเซิร์ฟเวอร์ แต่ฉันไม่ทราบว่าเป็นเรื่องปกติ
Claudiu

8
@ Travis: ฉันไม่ได้พูดว่า "คุณไม่ควรกังวลเกี่ยวกับเรื่องนี้" ฉันแค่บอกว่าถ้าคุณต้องการโปรแกรมโอเพนซอร์ซคุณจะไม่ต้องการเขียนมันในจาวาสคริปต์ฝั่งไคลเอ็นต์เพราะความงงงวยใด ๆ ที่คุณทำจะไม่ป้องกันมันจากการย้อนกลับ (ง่าย ๆ )
Claudiu

8
ขวา. ซึ่งจะไม่มีคำตอบ "ฉันจะทำให้ JavaScript ของฉันสับสน" ได้อย่างไร การทำให้งงงวยไม่ใช่แนวคิดที่เป็นนามธรรม แต่เป็นแนวคิดทางเทคนิค op ถามง่ายๆว่า "อย่างไร?"
Madbreaks

2
@ Madadaks: คำถามอยู่ในบริบทของการไม่ทำให้โค้ดโอเพนซอร์สของเขา คำตอบทางเทคนิคทันทีเป็นคำตอบที่ยอมรับได้ แต่คำตอบในบริบทที่ดีกว่า (เช่นคุณพยายามทำอะไรจริงๆ) คือ IMO ที่คุณไม่สามารถมีจาวาสคริปต์ฝั่งไคลเอ็นต์ที่ไม่ใช่โอเพ่นซอร์สเพราะ ทุกคนมีแหล่งข้อมูลโดยไม่คำนึงถึงวิธีทำให้งงงวย ทั้งสองวิธีอยู่ที่นี่และผู้คนสามารถอ่านและได้รับประโยชน์จากทั้งสองอย่าง
Claudiu

45

มีเครื่องมือทำให้งงงวย JavaScript จำนวนมากมายที่สามารถใช้ได้อย่างอิสระ อย่างไรก็ตามฉันคิดว่ามันสำคัญที่จะต้องทราบว่ามันเป็นเรื่องยากที่จะทำให้งงงวย JavaScript ไปยังจุดที่มันไม่สามารถย้อนกลับวิศวกรรม

ด้วยเหตุนี้มีหลายตัวเลือกที่ฉันคุ้นเคยกับการทำงานล่วงเวลาในระดับหนึ่ง:

  • ยูอิคอมเพรสเซอร์ ตัวบีบอัด JavaScript ของ Yahoo! ทำงานได้ดีในการกลั่นโค้ดที่จะปรับปรุงความเร็วในการโหลด มีระดับของความสับสนเล็กน้อยที่ทำงานค่อนข้างดี ที่สำคัญคอมเพรสเซอร์จะเปลี่ยนชื่อฟังก์ชั่นลบพื้นที่สีขาวและปรับเปลี่ยนตัวแปรท้องถิ่น นี่คือสิ่งที่ฉันใช้บ่อยที่สุด นี่เป็นเครื่องมือบน Java แบบโอเพนซอร์ซ

  • JSMinเป็นเครื่องมือที่เขียนโดย Douglas Crockford ที่พยายามลดขนาดแหล่ง JavaScript ของคุณ ในคำพูดของ Crockford "JSMin ไม่ได้ทำให้งงงวย แต่มันก็น่าเกลียด" เป้าหมายหลักคือการลดขนาดแหล่งที่มาของคุณเพื่อให้โหลดได้เร็วขึ้นในเบราว์เซอร์

  • ฟรี JavaScript Obfuscator นี่เป็นเครื่องมือบนเว็บที่พยายามทำให้โค้ดของคุณยุ่งเหยิงโดยการเข้ารหัสมัน ฉันคิดว่าการเสียรูปแบบของการเข้ารหัส (หรือการทำให้งง) ทำให้เกิดขนาดไฟล์ได้ อย่างไรก็ตามนั่นเป็นเรื่องของการตั้งค่าส่วนตัว


19
ตั้งแต่รหัส Javascript ต้องทำงานบนเครื่องของลูกค้าก็ไม่ยากเพียงเพื่อทำให้งงงวยไปยังจุดที่รหัสไม่สามารถจะกลับวิศวกรรม แต่เป็นไปไม่ได้
Schwern

20
มันเกี่ยวกับสถิติ เกณฑ์ที่ใครบางคนกำลังจะเข้าถึงรหัสของคุณด้วยความงงงวยและไม่? พวกเขายังสามารถเข้าถึงได้ แต่ยิ่งมีขีด จำกัด มากเท่าไหร่ ผู้คนจำนวนน้อยที่รู้เกี่ยวกับบางสิ่งบางอย่างปลอดภัยมากขึ้น การปฏิบัติจำแนกความปลอดภัยมาตรฐาน
Cris Stringfellow

1
@PeterR ค้นหา / แทนที่ใน text editor จะทำให้ชีวิตของคุณยากขึ้นที่จะลองอ่านหรือทำวิศวกรรมย้อนกลับ มันไม่สมบูรณ์แบบ แต่เพิ่มเลเยอร์ความรำคาญ / ความยากพิเศษโดยการลบบริบท โปรแกรมเมอร์ส่วนใหญ่ไม่ฉลาดเท่าคุณซึ่งทำให้สิ่งนี้เป็นเครื่องยับยั้งที่ยอดเยี่ยม
SED

1
@SED ฉันไม่รู้จักโปรแกรมเมอร์คนเดียวที่ไม่สามารถค้นหา / แทนที่กลุ่มของ[ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]vars เป็นอย่างน้อย[var1, var2,..]ภายในหนึ่งนาที ฉันสามารถ de-uglify, เยื้อง, และค้นหา / แทนที่ชื่อ var ภายในสองนาที และไม่ฉันฉลาดกว่า Jr. Dev ทั่วไปทั่วไป ความจริงง่ายๆคือไม่มีวิธีปิดบังฝั่งไคลเอ็นต์ JS คุณสามารถซื้อได้ด้วยตัวเอง 5 นาทีสูงสุด แต่ก็ไม่มีประโยชน์ สิ่งนี้เป็นเพียงการขายคนที่ไม่รู้จักรหัสใน "ความปลอดภัย" ที่เพิ่มเข้ามา ไม่มีใครที่เคยเขียนบรรทัดของ JS จะซื้ออึนั้น
ปีเตอร์ R

3
@PeterR "ฉันสามารถลบ -ugug, reent เยื้อง, และค้นหา / แทนที่ชื่อ var ภายในสองนาที" - แน่นอนไปข้างหน้าและลองใช้กับหลายฐานรหัส minified, obfuscated, 20MB codebase พร้อมโครงสร้างที่ใช้เวลา สัปดาห์ที่จะเข้าใจแม้จะมีต้นฉบับซอร์สโค้ดแสดงความคิดเห็น และเพื่อทำให้มันยากยิ่งขึ้นเครื่องมือทำให้งงงวยมีอยู่ที่จงใจทำให้โค้ดของคุณเสียหายหากการเยื้องบรรทัดและอื่น ๆ เปลี่ยนไป
John Weisz

23

ฉันจะทำอะไร:

A.หมุนรอบแฮ็กเกอร์!

นี่จะเป็นในส่วนที่สองของฉันรหัสลับจาวาสคริปต์ลับเปิดตัว LAUNCHER สิ่งที่คุณเห็นในซอร์สโค้ด

รหัสนี้คืออะไร

  1. โหลดรหัสจริง
  2. กำหนดส่วนหัวที่กำหนดเอง
  3. โพสต์ตัวแปรที่กำหนดเอง

var ajax=function(a,b,d,c,e,f){
 e=new FormData();
 for(f in d){e.append(f,d[f]);};
 c=new XMLHttpRequest();
 c.open('POST',a);
 c.setRequestHeader("Troll1","lol");
 c.onload=b;
 c.send(e);
};
window.onload=function(){
 ajax('Troll.php',function(){
  (new Function(atob(this.response)))()
 },{'Troll2':'lol'});
}

B.ทำให้งงงวยรหัสเล็กน้อย

นั่นคืออะไร?

  1. นั่นคือรหัสเดียวกันข้างต้นใน base64
  2. นี่ไม่ใช่รหัสจาวาสคริปต์ SECRET

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()

Cสร้างยากที่จะแสดงไฟล์ php ด้วยรหัสจริงภายใน

รหัส php นี้คืออะไร

  1. ตรวจสอบผู้อ้างอิงที่ถูกต้อง (โดเมน / dir / รหัสของตัวเรียกใช้ของคุณ)
  2. ตรวจสอบ HEADER ที่กำหนดเอง
  3. ตรวจสอบตัวแปร POST ที่กำหนดเอง

หากทุกอย่างโอเคมันจะแสดงรหัสที่ถูกต้องให้คุณเป็นรหัสปลอมหรือแบนไอพีให้ปิดหน้า .. ไม่ว่าอะไรก็ตาม

<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
 echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
 echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>

base64 referrer = http://here.is/my/launcher.html

SECRET javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

ปลอม = window.open('', '_self', '');window.close();

ตอนนี้ .. ถ้าคุณกำหนดตัวจัดการเหตุการณ์ในจาวาสคริปต์ SECRET มันอาจจะเข้าถึงได้ .. คุณต้องกำหนดมันไว้ข้างนอกด้วย launchcode และชี้ไปที่ฟังก์ชัน SECRET ที่ซ้อนกัน

ดังนั้น ... จะมีวิธีง่ายๆในการรับรหัสหรือไม่ document.body.appendChild(document.createElement('div')).innerText='Awesome';

ฉันไม่แน่ใจว่าใช้งานได้หรือไม่ แต่ฉันใช้โครเมียมและตรวจสอบองค์ประกอบทรัพยากรเครือข่ายแหล่งข้อมูลไทม์ไลน์โปรไฟล์การตรวจสอบ แต่ฉันไม่พบบรรทัดด้านบน

Note1: หากคุณเปิด Troll.php url จาก Inspect element-> network ใน chrome คุณจะได้รับรหัสปลอม

note2: โค้ดทั้งหมดเขียนขึ้นสำหรับเบราว์เซอร์สมัยใหม่ polyfill ต้องการโค้ดจำนวนมาก

แก้ไข

launcher.html

<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>

Troll.php

<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>

1
โอ้และใช่ฉันก็จะทำให้งงงวยรหัสจาวาสคริปต์
cocco

1
นี่คือสิ่งที่ฉันคิดเกี่ยวกับการแคร็กเกอร์ ผมอยากจะเห็นอะไรเช่นนี้ได้โดยไม่ต้องใช้ PHP :)
pgarciacamou

6
แม้ว่าจะเป็นเรื่องตลกนักพัฒนาเว็บที่สามารถตรวจสอบเว็บไซต์ได้อย่างถูกต้องก็สามารถรับซอร์สโค้ดได้ ฉันคิดว่าไม่มีวิธีที่จะซ่อนข้อมูลประเภทใด ๆ ในขณะที่คุณวางข้อมูลออนไลน์
cocco

ฉันคิดว่ามันไม่ได้ทำให้งงงวยใด ๆ อย่างไรก็ตามรู้วิธีเปิดคอนโซลเขาอาจรู้เกี่ยวกับการเข้ารหัส / ถอดรหัส base64 ง่ายมาก
T.Todua

19

ลองJScrambler ฉันให้มันหมุนเร็ว ๆ นี้และรู้สึกประทับใจกับมัน มันมีชุดเทมเพลตสำหรับการทำให้งงงวยด้วยการตั้งค่าที่กำหนดไว้ล่วงหน้าสำหรับผู้ที่ไม่สนใจรายละเอียดมากนักและเพียงแค่ต้องการให้มันเสร็จอย่างรวดเร็ว คุณยังสามารถสร้างความงงงวยแบบกำหนดเองได้โดยเลือกการแปลง / เทคนิคที่คุณต้องการ


7
การสมัครสมาชิก JScrambler นั้นแพงมาก ... การสมัครที่ถูกที่สุดต้องใช้ราคาขั้นต่ำ 3 เดือน $ 145 - มันบ้า
barbushin

1
ตอนนี้พวกเขามีแผนฟรี แผนการสมัครสมาชิกอื่น ๆ ยังคงมีราคาแพง
user7610

2
แผนฟรีรวมถึงการเพิ่มประสิทธิภาพและการลดขนาดเท่านั้น
Jean Hominal

1
'แผนฟรีรวมถึงการเพิ่มประสิทธิภาพและการลดขนาด' ใช่ไม่ การทำให้งงงวยและการเพิ่มประสิทธิภาพไม่ได้ไปด้วยกันขอโทษ
NiCk Newman

2
ดูที่เว็บไซต์ของ JScrambler วันนี้และแผนการกำหนดราคาที่มากกว่านี้ฉันไม่เห็นตัวเลือกฟรี ทดลองใช้ฟรีเท่านั้น ..
KDT

18

ปัญหาเกี่ยวกับภาษาที่แปลคือคุณส่งแหล่งข้อมูลเพื่อให้พวกเขาใช้งานได้ (ยกเว้นว่าคุณมีคอมไพเลอร์ไปยัง bytecode แต่จากนั้นอีกครั้งก็เป็นเรื่องเล็กน้อยที่จะถอดรหัส)

ดังนั้นหากคุณไม่ต้องการเสียสละประสิทธิภาพคุณสามารถทำได้เฉพาะชื่อตัวแปรและฟังก์ชันเช่น แทนที่พวกเขาด้วย a, b ... aa, ab ... หรือ a101, a102 เป็นต้นและแน่นอนให้ลบพื้นที่ / บรรทัดใหม่ให้มากที่สุดเท่าที่จะทำได้ (นั่นคือสิ่งที่เรียกว่า JS compressors)
สตริงที่ทำให้ยุ่งเหยิงจะมีผลการปฏิบัติงานหากคุณต้องเข้ารหัสและถอดรหัสในแบบเรียลไทม์ บวกกับดีบักเกอร์ JS สามารถแสดงค่าสุดท้าย ...


17

ตรงกันข้ามกับคำตอบอื่น ๆ ที่ฉันแนะนำให้ใช้กับ YUI Compressor; คุณควรใช้Google ปิด

ไม่มากเพราะมันบีบอัดมากกว่า แต่ส่วนใหญ่เป็นเพราะมันจะจับข้อผิดพลาดจาวาสคริปต์เช่นa = [1,2,3,];ที่ทำให้ IE ไปรวน


5
ไม่ควรตรวจสอบรหัสของคุณจากข้อผิดพลาดและความไม่ลงรอยกันทำอย่างใดอย่างหนึ่งก่อนที่จะสับสน? ไม่มีอะไรเกี่ยวข้องกับการทำให้
งง

13

แอพพลิเคชั่นที่ไม่ใช้ซอร์สของ Javascript นั้นค่อนข้างโง่ Javascript เป็นภาษาที่ตีความโดยฝั่งไคลเอ็นต์ .. การทำให้งงงวยไม่ได้ป้องกันมาก ..

การทำให้งงงวย JS มักจะทำเพื่อลดขนาดของสคริปต์แทนที่จะ "ป้องกัน" มัน หากคุณอยู่ในสถานการณ์ที่คุณไม่ต้องการให้รหัสของคุณเป็นแบบสาธารณะ Javascript ไม่ใช่ภาษาที่ถูกต้อง ..

มีเครื่องมือมากมายรอบ ๆ แต่ส่วนใหญ่มีคำว่า "compressor" (หรือ "minifier") ในชื่อของมันด้วยเหตุผล ..


11

คุณไม่สามารถรักษาความปลอดภัยรหัสฝั่งไคลเอ็นต์: เพียงกด F12 บน Google Chrome หยุดการประมวลผลจาวาสคริปต์และคุณจะได้รับข้อความทั้งหมดแม้กระทั่งรหัส บรรเจิดและเปลี่ยนชื่อตัวแปรและคุณจะได้รับรหัสต้นฉบับเกือบ

หากคุณกำลังเขียนจาวาสคริปต์ฝั่งเซิร์ฟเวอร์ (เช่น NodeJS) กลัวว่าใครบางคนกำลังแฮ็คข้อมูลลงในเซิร์ฟเวอร์ของคุณและต้องการให้แฮกเกอร์ทำงานได้ยากขึ้นให้เวลากับคุณในการเข้าถึงกลับมากขึ้นจากนั้นใช้คอมไพเลอร์ javacript :

คุณต้องใช้การปิดคอมไพเลอร์ในการรวบรวมขั้นสูงเนื่องจากเป็นเครื่องมือเดียวที่เปลี่ยนชื่อตัวแปรทั้งหมดของคุณแม้ว่าจะใช้ในหลายไฟล์ / โมดูล แต่ก็มีปัญหามันจะทำงานเฉพาะถ้าคุณเขียนในมันเข้ารหัสรูปแบบ


การปิดคอมไพล์ไม่ใช่รหัสที่ทำให้งงงวย: P
NiCk Newman

1
มันไม่ได้ทำเพื่อมัน แต่ใช้งานได้ดี: มันไม่ได้เพิ่มรหัสพิเศษเช่นคอมไพเลอร์บางตัว (ซึ่งมักจะสามารถย้อนกลับได้ซึ่งเครื่องมือที่ฉันอ้างถึง) แต่เปลี่ยนเป็นวิธีที่ผิดปกติบางอย่างยากที่จะยกเลิกและลบที่ไม่ได้ใช้ รหัสซึ่งเมื่อเทียบกับ obfuscation จริงดีต่อประสิทธิภาพ
Gustavo Rodrigues

1
ไม่ใช่ความคิดที่ดี การลดขนาด / การคอมไพล์โค้ดฝั่งเซิร์ฟเวอร์อาจแนะนำปัญหาด้านความปลอดภัยหากตัวขยายมีข้อผิดพลาด: zyan.scripts.mit.edu/blog/backdooring-js
mgol

ข้อผิดพลาดที่คุณอ้างถึงใช้กับ UglifyJS เท่านั้น: มันไม่ได้ใช้กับการปิดคอมไพเลอร์
Gustavo Rodrigues

สำหรับผู้ที่สนใจเกี่ยวกับการลดขนาดไฟล์จาวาสคริปต์ยังมีตัวกำจัดจาวาสคริปต์ ดังนั้นฉันไม่คิดว่ามันเป็นเลเยอร์ความปลอดภัยเลย
Fillipo Sniper

11

ฉันสามารถแนะนำJavaScript Utilityโดย Patrick J. O'Neil มันสามารถทำให้สับสน / กะทัดรัดและบีบอัดและดูเหมือนว่าจะค่อนข้างดีที่เหล่านี้ ที่กล่าวว่าฉันไม่เคยลองรวมไว้ในสคริปต์การสร้างใด ๆ

สำหรับเรื่องน่ารำคาญและการลดขนาด - ฉันไม่ใช่แฟนตัวยงของอดีต มันทำให้การดีบักเป็นไปไม่ได้ (ข้อผิดพลาดที่บรรทัดที่ 1 ... "รอมีเพียงหนึ่งบรรทัด") และพวกเขามักจะใช้เวลาในการแกะ แต่ถ้าคุณต้องการ ... ดี


1
แต่การทำให้ยุ่งเหยิงไม่จำเป็นต้องบีบอัดมันเป็นหนึ่งบรรทัดมันอาจจะง่ายเหมือนการเปลี่ยนฟังก์ชั่นและชื่อตัวแปรหรือการแปลงสตริงเป็นเบส 64 การย่อขนาดทำให้โค้ดทั้งหมดในหนึ่งบรรทัด
rw-nandemo

ทุกวันนี้ UglifyJS ดูเหมือนจะเป็นตัวเลือกที่ดีที่สุด ผู้เขียนก็เป็นคนที่เท่ห์เหมือนกัน! :)
Tsvetomir Tsonev

เกี่ยวกับการดีบักส่วนใหญ่คุณสามารถสร้างซอร์สแผนที่ซึ่งคุณสามารถรวมเมื่อทำการทดสอบเพื่อให้คุณเห็นว่ามีข้อผิดพลาดเกิดขึ้นที่บรรทัดใดแม้ว่าจะลดขนาดลง
Luca Steeb

5

ฉันขอแนะนำให้ลดขนาดครั้งแรกด้วยบางสิ่งบางอย่างเช่น YUI Compressor แล้วแปลงสตริงและตัวเลขทั้งหมดเป็นค่า HEX โดยใช้บางอย่างเช่นhttp://www.javascriptobfuscator.com/

ด้วยวิธีนี้รหัสจะถูกแสดงใกล้เป็นไปไม่ได้ที่จะเข้าใจและฉันคิดว่าในขั้นตอนนี้มันจะใช้เวลามากขึ้นสำหรับแฮ็กเกอร์ในการออกกฎหมายรหัสของคุณใหม่กว่าที่เป็นจริงถ้าเขาเขียนใหม่ตั้งแต่ต้น การเขียนใหม่และการโคลนนิ่งเป็นสิ่งที่คุณไม่สามารถหยุดได้ หลังจากทั้งหมดเราเป็นคนฟรี!


5

Dean Edward's Packer นั้นยอดเยี่ยมสำหรับผู้ obfuscator แม้ว่าส่วนใหญ่มันจะทำให้โค้ดยุ่งเหยิงไม่ใช่องค์ประกอบของสตริงที่คุณอาจมีในโค้ดของคุณ

ดู: เครื่องมือบีบอัด Javascript ออนไลน์ และเลือก Packer (Dean Edwards) จากดรอปดาวน์


มันไม่มีจุดหมาย มันสามารถแตกได้อย่างง่ายดายด้วยjsbeautifier.org
Maciej Krawczyk

4

ฉันอยู่ภายใต้ความประทับใจที่องค์กรบางแห่ง (เช่น: JackBe) ใส่รหัส JavaScript ที่เข้ารหัสไว้ในไฟล์ * .gif แทนที่จะเป็นไฟล์ JS เพื่อวัดความสับสนเพิ่มเติม


4

ลองใช้เครื่องมือนี้Javascript Obfuscator

ฉันใช้มันในเกม HTML5 ของฉันไม่เพียง แต่ลดขนาดจาก 950KB เหลือ 150 แต่ยังทำให้ซอร์สโค้ดคอมไพเลอร์ปิดไม่สามารถอ่านได้และตัวแปลงกลับเป็นแบบย้อนกลับฉันเองไม่รู้วิธีย้อนกลับการทำให้งงงวยนี้


4

ฉันใช้Jasobมานานหลายปีแล้ว
มันมี UI ขั้นสูง แต่ยังคงใช้งานง่ายและใช้งานง่าย
นอกจากนี้ยังจะจัดการไฟล์ HTML และ CSS

วิธีที่ดีที่สุดในการใช้งานคือการใส่คำนำหน้าตัวแปรส่วนตัวทั้งหมดของคุณด้วยการขีดเส้นใต้จากนั้นใช้sortฟีเจอร์เพื่อจัดกลุ่มทั้งหมดเข้าด้วยกันและทำเครื่องหมายเป็นเป้าหมายสำหรับการทำให้งงงวย

ผู้ใช้ยังสามารถดูแหล่งที่มาของคุณ แต่มันเป็นเรื่องยากมากที่จะถอดรหัสเมื่อตัวแปรส่วนตัวของคุณจะถูกแปลงจากสิ่งที่ชอบที่จะ_sUserPreferredNickNamea

เอ็นจิ้นจะเพิ่มจำนวนตัวแปรเป้าหมายโดยอัตโนมัติและจัดลำดับความสำคัญเพื่อรับการบีบอัดสูงสุด

ฉันไม่ได้ทำงานให้กับ Jasob และฉันก็ไม่ได้รับการโปรโมทเลยเพียงแค่ให้คำแนะนำที่เป็นมิตร
ข้อเสียคือไม่ฟรีและมีราคาแพง แต่ก็คุ้มค่าเมื่อเทียบกับทางเลือก - ตัวเลือก 'ฟรี' ไม่ได้เข้ามาใกล้


เจสันดูเหมือนจะเป็น minifier มากกว่า obfuscator ฉันพลาดอะไรไปรึเปล่า?
Alan McBee - MSFT

4

คุณเคยลองBananascriptไหม? มันสร้างรหัสบีบอัดสูงและอ่านไม่ได้อย่างสมบูรณ์


18
มันบีบอัดรหัสอย่างดี แต่เพียงแค่เปลี่ยนeval()ในบรรทัดสุดท้ายconsole.log()และคอนโซลของคุณจะคายสิ่งทั้งหมด
LobsterMan

4

ฉันใช้โปรแกรม Utility-Compiler สำหรับการปิดการใช้งานจาวาสคริปต์ มันลดขนาดรหัสและมีตัวเลือกเพิ่มเติมสำหรับ obfuscation ยูทิลิตี้นี้มีให้ที่ Google โค้ดที่ URL ด้านล่าง:
เครื่องมือปิด

แต่วันนี้ฉันได้ยิน UglifyJS มาก คุณสามารถค้นหาการเปรียบเทียบต่าง ๆ ระหว่างการปิดคอมไพเลอร์และ UglifyJS ซึ่ง Uglify น่าจะเป็นผู้ชนะ
UglifyJS: คอมเพรสเซอร์ JavaScript ใหม่ที่รวดเร็วสำหรับ Node.js ที่เทียบเท่ากับการปิด

เร็ว ๆ นี้ฉันจะให้โอกาส UglifyJS



3

อันนี้ลดขนาดแต่ไม่ทำให้งง หากคุณไม่ต้องการใช้ Java บรรทัดคำสั่งคุณสามารถวางจาวาสคริปต์ในเว็บฟอร์ม


1
หมายเหตุ: การเชื่อมโยงจะตายแล้ว
Scott C Wilson

1
@ScottWilson ขอบคุณอัปเดต
Chris S

2

คุณควรพิจารณาดูObfuscriptorอย่างแน่นอน

ฉันไปเกินทั่วไปเทคนิคการลดรูปจาวาสคริปต์ที่เราได้เห็นจากเครื่องมืออื่น ๆ เช่นยูอิคอมเพรสเซอร์หรือGoogle ปิด

รหัสที่ยุ่งเหยิงดูเหมือนเข้ารหัสมากขึ้น ไม่เหมือนสิ่งที่ฉันเคยเห็นมาก่อน


ขอบคุณสำหรับลิงค์! เพิ่งลอง obfuscriptor และเข้ารหัสรหัสแน่นอน (โดยไม่มีคีย์ ???) และบีบอัดสคริปต์ของฉันจาก 211 ถึง 36 Kb!

โปรดทราบว่า Obfuscriptor แจ้งเตือนคุณว่าไม่ทำงานกับ IE นั่นเป็นตัวทำลายข้อตกลงสำหรับบางคน
Alan McBee - MSFT

1
ลิงก์ในคำตอบไม่ได้ชี้ไปที่เครื่องมืออีกต่อไป ฉันไม่พบการอ้างอิงสดอีกต่อไป
buzoherbert

ลิงค์แรกเสียชีวิต "Obfuscriptor"
Alp Altunel

2

หากคุณใช้ไลบรารี JavaScript ให้พิจารณา Dojo Toolkit ซึ่งเข้ากันได้ (หลังจากแก้ไขเล็กน้อย) ด้วยการคอมไพล์โหมดขั้นสูงของคอมไพเลอร์ปิด

Dojo - ไลบรารี JavaScript เดียวเท่านั้นที่เข้ากันได้กับ Off Compiler

โค้ดที่คอมไพล์ด้วยโหมดปิดขั้นสูงนั้นแทบจะเป็นไปไม่ได้เลยที่จะทำวิศวกรรมย้อนกลับแม้จะผ่านทางโปรแกรมเสริมความงามเนื่องจากฐานรหัสทั้งหมด (รวมทั้งห้องสมุด) ก็ไม่ชัดเจน มันยังเล็กโดยเฉลี่ย 25%

รหัส JavaScript ที่ย่อขนาดลงเท่านั้น (YUI Compressor, Uglify ฯลฯ ) นั้นง่ายต่อการย้อนกลับวิศวกรหลังจากผ่านตัวปรับแต่งความงาม


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.