คุณจะป้องกันไม่ให้เกมเว็บ JavaScript / HTML5 ของคุณถูกคัดลอกหรือเปลี่ยนแปลงได้อย่างไร


45

ฉันกำลังวางแผนสร้างเกมด้วย JavaScript และ HTML5

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

สามารถทำอะไรเพื่อป้องกันไม่ให้ใครก็ตามอ่าน JavaScript ได้หรือไม่

ถ้าไม่การประมวลผลเกมทั้งหมดควรจะเกิดขึ้นบนเซิร์ฟเวอร์ที่มีความรับผิดชอบเพียงอย่างเดียวของลูกค้าที่กำลังจับภาพการป้อนข้อมูลของผู้ใช้และการวาดภาพกราฟิก?


22
คุณย่อหน้าสุดท้ายกำลังอ่านเกี่ยวกับสิทธิของตนจริงสำหรับปพลิเคชันทางธุรกิจและความจริงสำหรับเกมเสมอรักษาลูกค้าเป็น hostle
เนท

4
ถ้าฉันสามารถอ่านได้เบราว์เซอร์ของฉันมีสำเนาอยู่แล้ว จากนั้นฉันยังสามารถบันทึกที่อื่นได้ ทุกสิ่งที่คุณอนุญาตให้อ่านสามารถคัดลอกได้
BerggreenDK

คำตอบ:


44

เก็บข้อมูลเกมทั้งหมดของคุณและ logics ไว้บนเซิร์ฟเวอร์ ส่วนหนึ่งของเกมที่อยู่ฝั่งไคลเอนต์สามารถคัดลอกได้โดยใช้เครื่องมือที่เหมาะสมต่อไป (แม้ว่าจะอยู่ใน Flash หรือ Java) ดังนั้นให้ยอมรับมันและไม่สนใจมันมากนัก

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


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

1
นั่นไม่ได้หมายความว่าคุณไม่ควรลดขนาดลงนั่นเป็นการตัดคนขี้เกียจ คุณสามารถลองประมวลผลลอจิกเกมของคุณบนเซิร์ฟเวอร์และส่งคืนออบเจ็กต์ json ผ่าน ajax แต่การกลับมาสามารถดูได้ด้วย firebug ทำให้สับสนในเวอร์ชันโปรดักชั่นของคุณ แต่ให้เก็บเวอร์ชันคอมเม้นท์ไว้อย่างหนักสำหรับตัวคุณเอง คุณสามารถทำสิ่งต่าง ๆ เพื่อยับยั้งผู้คน แต่ไม่มีทางปลอดภัย 100%
จอห์น

3
จริง การขยายโค้ดที่ย่อเล็กสุดนั้นไม่ได้ใช้ความพยายามมากนัก jsbeautifier.org
James

@John โปรดสังเกตว่าบางครั้งอาจทำให้คนขี้เกียจไม่เกี่ยวข้องเนื่องจากบางเกมถูกทำลายเมื่อมีสิบแปดมงกุฎปรากฏขึ้นดังนั้นมันจึงไม่เกี่ยวข้องเลยหากมีคนโกงเพียงคนเดียวหรือหลายคน
o0 '

11

วิธีที่คุณสามารถป้องกันใครบางคนจากการคัดลอก JavaScript จากเว็บเซิร์ฟเวอร์และสร้างเกมของตัวเองด้วยวิธีนี้ (ไม่ใช่สิ่งที่ฉันกังวลมากที่สุด)

นี่คือที่กฎหมายช่วย ในทางปฏิบัติสิ่งนี้ดูเหมือนจะไม่เกิดขึ้นบ่อยนัก

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

ไม่มีลูกค้าที่เชื่อถือได้ในป่าเพราะเหตุผลประเภทนี้ ยอมแพ้ต่อความฝันนี้เดี๋ยวนี้ :)


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

เจตนาของคำตอบนั้นไม่มากนักที่จะแนะนำการดำเนินการทางกฎหมาย แต่เพื่อชี้ให้เห็นว่าการพยายามปิดกั้นซอฟต์แวร์ดังกล่าวนั้นส่วนใหญ่ไม่มีจุดหมายอย่างน้อยส่วนหนึ่งเป็นเพราะผู้คนจำนวนมากที่จะคัดลอกมันถูกท้อแท้ตามกฎหมาย สามารถทำวิศวกรรมย้อนกลับได้ไม่ว่าพวกเขาจะใช้ Javascript หรือไม่ก็ตาม
Kylotan

8

เช่นเดียวกับคนอื่น ๆ ได้แนะนำ; เก็บรหัสให้มากที่สุดเท่าที่เป็นไปได้ฝั่งเซิร์ฟเวอร์

วิธีที่ฉันใช้ในการจัดการกับการคัดลอกโค้ดนั้นค่อนข้างแปลก แต่มันก็ใช้งานได้ดีจนถึงตอนนี้

  • ฝั่งเซิร์ฟเวอร์สร้างรหัสเฉพาะและเก็บไว้ใช้ในภายหลัง
  • ฝั่งเซิร์ฟเวอร์เพิ่ม id เฉพาะในองค์ประกอบสคริปต์ในระหว่างการแสดงผล html
  • ฝั่งไคลเอ็นต์สร้างการเชื่อมต่อ WebSocket และส่ง id ที่ไม่ซ้ำกันไปยังเซิร์ฟเวอร์
  • ฝั่งเซิร์ฟเวอร์จับคู่ id กับรายการปัจจุบัน
  • หากไม่พบข้อมูลที่ตรงกันให้ปิดการเชื่อมต่อ
  • หากการแข่งขันจะพบแทนที่ข้อความจัดการกับของคุณหนึ่ง "เหมาะสม" และ ID ทิ้ง
  • สตรีมรหัสลับของคุณไปยังไคลเอนต์ในฐานะ JSON, {"func": "function () {dostuff ();}"}
  • ฝั่งไคลเอ็นต์คอยดูข้อความหากมี "func" อยู่ให้ทำ eval

ตอนนี้รหัสลับของคุณกำลังเรียกใช้งานฝั่งไคลเอ็นต์และจะไม่แสดงในมุมมองซอร์สโค้ดหรือผู้ตรวจสอบ / คอนโซล ยังมีวิธีในการรับรหัส แต่มันค่อนข้างยากขึ้น


ถ้าฉันต้องการคว้าบางสิ่งบางอย่างจากโซลูชันด้านบน ฉันจะเชื่อมต่อ WebSocket จริงด้วยและพยายามสร้าง "ไคลเอนต์ปลอม" หรือใช้เครื่องมือดีบั๊ก Firebug ในเบราว์เซอร์และหยุดสคริปต์เพื่อชำระค่า
BerggreenDK

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

มันค่อนข้างง่ายที่จะเขียนไคลเอนต์ปลอมที่เพิ่งโหลดไคลเอนต์จริงจากเซิร์ฟเวอร์และกำหนดค่าความลับปัจจุบันจากมันทุกครั้งที่เริ่ม
Paul Legato

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

3

วิธีเดียวที่จะแน่ใจได้อย่างสมเหตุสมผลว่ารหัสเกมของคุณจะปลอดภัยคือการสร้างเกมประเภทไคลเอนต์ / เซิร์ฟเวอร์และใส่รหัสให้มากที่สุดเท่าที่จะทำได้บนเซิร์ฟเวอร์ และแน่นอนทำให้เซิร์ฟเวอร์นั้นปลอดภัย!

ปัญหาหลักคือถ้ารหัสกำลังทำงานอยู่บนคอมพิวเตอร์ของฉันฉันสามารถตรวจสอบถอดรหัสมันและคำนวณว่ามันทำงานอย่างไร สิ่งนี้เป็นจริงสำหรับ JavaScript, Flash, C ++, อย่างอื่น ในความเป็นจริงในการพัฒนา MMO (ซึ่งเป็นที่ที่มีประสบการณ์การทำงานระดับมืออาชีพของฉันเป็นอย่างมาก) ข้อสันนิษฐานจากจุดเริ่มต้นคือการที่ลูกค้าถูกประนีประนอม: สิ่งที่คุณเขียนสำหรับลูกค้านั้นอยู่ในมือของใครก็ตามที่ต้องการ ไม่.

การลดขนาดรหัสช่วยป้องกันคนที่ขี้เกียจเกินกว่าที่จะย่อขนาดได้โดยใช้หนึ่งในเครื่องมือที่มีอยู่มากมาย (แต่รหัสการผลิตควรย่อให้เล็กลงเพื่อลดการปล่อยข้อมูล)

แต่ถ้าคุณอยู่ในสถานการณ์ที่เจ้านายของคุณต้องการการป้องกันรหัสบางอย่างคุณสามารถ google "Javascript obfuscator" - มีซอฟต์แวร์ฟรีและจ่ายเงินจำนวนมากที่ทำให้ JS อย่างน้อยเกี่ยวกับการไม่อนุญาต เพื่อถอดรหัสในขณะที่ Flash เป็น


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

3

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


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

0

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


-1

คุณต้องใช้ Javascript Minifier มีตัวเลือกมากมายให้เลือกค้นหาตามต้องการ หากต้องการบันทึกการวิจัยบางส่วนที่นี่คุณสามารถทดลองใช้Yahoo Minifierได้ ฉันไม่ได้ใช้ตัวเอง แต่คิดว่ามันจะทำในสิ่งที่คุณต้องการ เป้าหมายคือ 1) ลดขนาดไฟล์และ 2) รหัสทำให้งงงวย สิ่งนี้สามารถทำได้โดยการลบช่องว่างความคิดเห็นและการแทนที่ชื่อตัวแปรทั้งหมดด้วยชื่อที่สั้นกว่าและไร้สาระ

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


7
ความปลอดภัยโดยความคลุมเครือปิดบังความปลอดภัยที่อาจเกิดขึ้น :)
Rushyo

1
โอ้ได้โปรด. ฉันได้ยินคำพูดนี้ตลอดเวลา แต่มันก็ไม่จริง ความจริงจะบอกให้ปิดบัง JS อย่างน้อยก็จะขัดขวางบางคน

2
minifier ไม่ช่วยเขา ฉันเชื่อว่าคน "จริงจัง" ส่วนใหญ่รู้วิธี "ขยาย" สคริปต์เหล่านั้นอีกครั้ง
BerggreenDK

1
@Sergio: คุณได้ยินคำพูดนี้ตลอดเวลาเพราะคุณรู้ว่ามันเป็นความจริง มันจะยับยั้งคน "บางคน" จริง แต่ขัดขวางคน "บางคน" นั้นไม่มีจุดหมาย: เมื่อคุณแตกครั้งเดียวคุณลงไป
o0 '

-1

ใช้คอมไพเลอร์ปิดของ Google http://code.google.com/closure/compiler/ ไม่ใช่เพียง js minimizer;)

ประโยชน์ของการใช้โปรแกรมปิดคอมไพเลอร์คืออะไร?

  1. อย่างมีประสิทธิภาพ ตัวรวบรวมการปิดลดขนาดไฟล์ JavaScript ของคุณและทำให้มีประสิทธิภาพมากขึ้นช่วยให้แอปพลิเคชันของคุณโหลดเร็วขึ้นและลดความต้องการแบนด์วิดท์ของคุณ

  2. ตรวจสอบรหัส คอมไพเลอร์ปิดให้คำเตือนสำหรับ JavaScript ที่ผิดกฎหมายและคำเตือนสำหรับการดำเนินการที่อาจเป็นอันตรายช่วยให้คุณสร้าง JavaScript ที่มีค่าน้อยและง่ายต่อการบำรุงรักษา 1


-1

หรือคุณสามารถใช้บางอย่างเช่น Game Maker HTML5 เพื่อสร้างเกมของคุณซึ่งจะทำให้รหัสไม่เหมาะกับคุณ นั่นหมายความว่ามันจะทำให้โค้ดไม่สามารถอ่านได้กับมนุษย์ และจะเป็นไปไม่ได้ที่จะแก้ไข


2
-1 การทำให้งงจะไปไกลแค่ไหน แน่นอนว่ามันจะไม่ปกป้องเกมจากการถูกคัดลอกหรือเปลี่ยนแปลง - ดังที่ได้กล่าวไว้ในคำตอบที่ทำให้งงงวยอื่น ๆ สำหรับคำถามนี้
doppelgreener

-1

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


-1

การวางทุกอย่างบนเซิร์ฟเวอร์อาจมีปัญหาด้านประสิทธิภาพและไม่ได้ใช้ศักยภาพของเว็บอย่างที่เรารู้จักในทุกวันนี้

คุณสามารถเขียนรหัสของคุณใน c ++ และคอมไพล์ให้กับไบนารี

Native Client (NaCl)

ดูhttps://stackoverflow.com/questions/9018537/how-to-run-c-programs-on-the-web-inside-a-browser


ยินดีต้อนรับสู่ GDSE OP ถามถึง JavaScript โดยเฉพาะ; ดังนั้นในขณะที่พวกเขาอาจจะสามารถ re-การเขียนไปยัง C ++ และใช้โซเดียมคลอไรด์, การแก้ปัญหาที่ไม่จริงตอบสนองความต้องการดังกล่าว นอกจากนี้คำตอบควรมีอยู่ในตัวเองเท่าที่จะทำได้ - เอ่ยถึง NaCl & การทิ้งลิงค์ไม่ดีเท่ากับการเสนอสรุปว่า NaCl คืออะไรหรือทำไมมันถึงช่วยได้
Pikalek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.