Làm cách nào để ngăn trò chơi web JavaScript / HTML5 của bạn bị sao chép hoặc thay đổi?


45

Tôi đang ở giữa kế hoạch một trò chơi được xây dựng bằng JavaScript và HTML5.

Tôi gặp khó khăn trong việc hiểu làm thế nào bạn có thể ngăn ai đó đơn giản sao chép JavaScript từ máy chủ web và tạo trò chơi của riêng họ với nó (không phải mối quan tâm lớn nhất của tôi) hoặc thay thế các chức năng JavaScript của riêng họ và dập tắt mọi hy vọng cho các khách hàng đáng tin cậy trong hoang dã nếu trò chơi cuối cùng là hỗ trợ nhiều người chơi.

Có thể làm bất cứ điều gì để ngăn chặn bất kỳ ai đọc JavaScript không?

Nếu không, tất cả quá trình xử lý trò chơi có nên diễn ra trên một máy chủ ở đâu đó với trách nhiệm duy nhất của khách hàng là nắm bắt đầu vào của người dùng và vẽ đồ họa không?


22
Đoạn cuối của bạn đọc về quyền, nó đúng cho các ứng dụng kinh doanh và đúng cho các trò chơi, luôn coi khách hàng là chủ nhà.
Nate

4
Nếu tôi có thể ĐỌC nó, trình duyệt của tôi đã có một bản sao. Sau đó tôi cũng có thể lưu nó ở một nơi khác. Bất cứ điều gì bạn cho phép được đọc, cũng có thể được sao chép.
BerggreenDK

Câu trả lời:


44

Giữ tất cả dữ liệu trò chơi và logic của bạn trên máy chủ. Dù sao, một phần của trò chơi ở phía máy khách có thể được sao chép bằng các công cụ thích hợp (ngay cả khi đó là trong Flash hoặc Java), vì vậy hãy chấp nhận nó và đừng quan tâm quá nhiều về nó.

Để giữ cho javascript của bạn ít sao chép hơn, vì khả năng đọc kém, bạn có thể thu nhỏ . Dù sao đó cũng là một cách làm tốt vì nó làm cho trang web chơi game tải xuống nhanh hơn.


4
Tùy thuộc vào thực tiễn mã hóa, tất cả nội dung trên máy chủ cũng có thể bị xâm phạm. Để giảm thiểu mã và làm xáo trộn chỉ ngăn chặn những người không muốn mất thời gian và lập bản đồ logic những gì nó đang làm. Điểm mấu chốt là, nếu bạn lo lắng về quyền sở hữu trí tuệ trong mã của mình; đừng đưa nó lên web
Giăng

1
Điều đó không có nghĩa là bạn không nên giảm bớt, điều đó ngăn cản những người lười biếng. Bạn cũng có thể thử xử lý logic trò chơi của mình trên máy chủ và trả về các đối tượng json thông qua ajax, nhưng trả về vẫn có thể được xem bằng fireorms. Làm xáo trộn phiên bản sản xuất của bạn nhưng giữ một phiên bản nhận xét nặng nề cho chính bạn (điều này làm cho việc duy trì khó khăn hơn). Bạn có thể làm những điều để răn đe mọi người, nhưng nó không bao giờ an toàn 100%.
Giăng

3
Thật. Mở rộng mã rút gọn thậm chí không mất nhiều công sức. jsbeautifier.org
James

@ John xin lưu ý đôi khi răn đe những người lười biếng là không liên quan, vì một số trò chơi bị hủy hoại một khi một kẻ lừa đảo xuất hiện, vì vậy nó không liên quan nếu chỉ có một hoặc nhiều người gian lận.
o0 '.

11

làm thế nào bạn có thể ngăn ai đó đơn giản sao chép JavaScript từ máy chủ web và tạo trò chơi của riêng họ với nó (không phải mối quan tâm lớn nhất của tôi)

Đây là nơi luật pháp giúp đỡ. Trong thực tế điều này dường như không xảy ra rất thường xuyên.

hoặc thay thế các chức năng JavaScript của riêng họ và dập tắt mọi hy vọng cho các khách hàng đáng tin cậy nếu trò chơi cuối cùng hỗ trợ nhiều người chơi.

Không có khách hàng đáng tin cậy trong tự nhiên, vì chính xác loại lý do này. Hãy từ bỏ giấc mơ này ngay bây giờ. :)


Luật pháp sẽ không được sử dụng nhiều khi trang web lưu trữ nó ở một quốc gia không quan tâm nhiều đến quyền sở hữu trí tuệ, hoặc ngược lại với quốc gia của bạn vì bất kỳ lý do gì. Ngay cả khi đó không phải là trường hợp, chi phí để bắt đầu một hành động pháp lý (có khả năng quốc tế) có thể vượt xa nguồn tài chính của một người sẽ hỏi câu hỏi này ở đây.
Paul Legato

Mục đích của câu trả lời không phải là quá nhiều để đề xuất hành động pháp lý, nhưng đề nghị rằng cố gắng khóa phần mềm như vậy hầu hết là vô nghĩa, ít nhất là một phần vì nhiều người sẽ sao chép nó bị pháp luật ngăn cản, nhưng cũng vì khách hàng có thể được thiết kế ngược cho dù họ có sử dụng Javascript hay không.
Kylotan

8

Cũng như mọi người khác đã khuyến nghị; giữ càng nhiều mã càng tốt phía máy chủ.

Một phương pháp tôi đã sử dụng để đối phó với sao chép mã là một chút kỳ lạ, nhưng nó đã hoạt động tốt cho đến nay.

  • Phía máy chủ, tạo id duy nhất và lưu trữ nó sau này.
  • Phía máy chủ, thêm id duy nhất trong thành phần tập lệnh trong khi kết xuất html.
  • Phía máy khách, tạo kết nối WebSocket và chuyển id duy nhất đến máy chủ.
  • Phía máy chủ, khớp id với danh sách hiện tại.
  • Nếu không tìm thấy kết quả khớp, kết nối chặt chẽ.
  • Nếu trận đấu được tìm thấy, thay thế xử lý tin nhắn với một "hợp lý" của bạn và loại bỏ id.
  • Truyền mã bí mật của bạn đến máy khách dưới dạng JSON, {"func": "function () {do ware ();}"}
  • Phía khách hàng, xem tin nhắn, nếu chúng có chứa "func", hãy đánh giá nó.

Bây giờ mã bí mật của bạn đang thực thi phía máy khách và sẽ không hiển thị trong nguồn xem hoặc bảng điều khiển / bảng điều khiển. Vẫn còn nhiều cách để lấy mã, nhưng nó khó hơn một chút.


Nếu tôi cần lấy một cái gì đó từ giải pháp trên; Tôi cũng sẽ kết nối WebSocket thật và cố gắng tạo một "ứng dụng khách giả" hoặc sử dụng công cụ gỡ lỗi Firebird trong trình duyệt và chỉ dừng tập lệnh để kiểm tra các giá trị.
BerggreenDK

Bạn không thể tạo một ứng dụng khách giả trừ khi bạn có thể dự đoán bằng cách nào đó các id duy nhất hiện có sẵn, vì chúng được tạo khi tải trang và được ném vào thời gian kết nối tập lệnh. Ngoài ra, việc dừng tập lệnh và xem các giá trị là khó khăn, vì bạn đang đánh giá một hàm ẩn danh. Như tôi đã nói, vẫn còn nhiều cách để lấy mã, nó chỉ khó hơn. Đối với hầu hết các phần, đủ để mã của bạn phải "đủ an toàn". Bạn không thể làm nhiều hơn thế với mã phía máy khách.
Stephen Belanger

Thật dễ dàng để viết một ứng dụng khách giả mạo, chỉ cần tải ứng dụng khách thực sự từ máy chủ và loại bỏ giá trị bí mật hiện tại từ nó mỗi khi nó khởi động.
Paul Legato

Tôi sẽ không nói nó "dễ dàng" đến mức "không thể". Như tôi đã nói, có nhiều cách xung quanh nó. Không có thứ gọi là hệ thống an toàn tuyệt đối. Chỉ cần các giao diện bị che khuất đầy đủ như vậy là hầu hết sẽ thấy quá nhiều nỗ lực để hack. Trong trường hợp này, bạn sẽ truyền các đoạn mã, do đó, một hacker sẽ cần tạo một máy khách để nhận và sắp xếp mã thành một cấu trúc hữu ích. Bạn sẽ truyền mã khi bạn cần, vì vậy tin tặc sẽ không có quyền truy cập ngay vào bãi chứa mã đầy đủ.
Stephen Belanger

3

Cách duy nhất để chắc chắn một cách hợp lý rằng mã trò chơi của bạn sẽ được bảo mật là xây dựng một loại trò chơi máy khách / máy chủ và đặt càng nhiều mã càng tốt trên máy chủ. Và tất nhiên, làm cho máy chủ đó an toàn!

Vấn đề chính là nếu mã đang chạy trên máy tính của tôi, tôi có thể kiểm tra nó, dịch ngược nó và tìm ra cách nó hoạt động. Điều này đúng với JavaScript, Flash, C ++, bất cứ điều gì khác. Trên thực tế, trong phát triển MMO (nơi có phần lớn kinh nghiệm chuyên môn của tôi), giả định ngay từ đầu là khách hàng bị xâm phạm: bất cứ điều gì bạn đã viết cho khách hàng đều nằm trong tay bất cứ ai muốn, độc hại hoặc không phải.

Mã giảm thiểu cung cấp một lượng nhỏ bảo vệ chống lại những người quá lười biếng để hủy bỏ nó bằng cách sử dụng một trong nhiều công cụ hiện có. (Nhưng mã sản xuất nên được thu nhỏ để giảm dấu chân dữ liệu của nó.)

Nhưng nếu bạn đang ở trong một tình huống, giả sử, sếp của bạn muốn có một loại bảo vệ mã nào đó, bạn có thể google "obfuscator" - có rất nhiều phần mềm miễn phí và trả tiền ngoài đó làm cho JS ít nhất là không bị ảnh hưởng để dịch ngược như Flash.


Tôi chỉ muốn chỉ ra rằng C ++ không cùng cấp với Javascript. C ++ biên dịch để lắp ráp, mà ai đó cần phải đọc để hiểu logic của trò chơi. Mỗi câu lệnh trong C ++ có thể tạo ra nhiều dòng trong cụm, điều này làm cho nó trở thành một nhiệm vụ rất tốn thời gian. Làm phiền javascript không giống nhau, vì cùng một ngôn ngữ. Bất cứ ai cũng có thể "làm đẹp" nó và bắt đầu đọc những câu nói gần như có thể đọc được của con người.
TomTsagk

3

Ngoài tất cả các cuộc thảo luận về mã này, hãy chắc chắn đặt một tuyên bố bản quyền rất rõ ràng ở đầu mỗi tệp và làm rõ rằng giấy phép không cho phép thay đổi hoặc sử dụng thương mại. Điều này cung cấp cho bạn truy đòi pháp lý nếu ai đó cố gắng sao chép nó. Nếu bạn không sẵn sàng ra tòa vì nó, thì toàn bộ câu hỏi này chủ yếu là học thuật.


Điều này tốt cho những gì nó có giá trị, nhưng đó không phải là nhiều. Khái niệm sở hữu trí tuệ trên thực tế không được công nhận ở nhiều quốc gia và trong mọi trường hợp, chi phí pháp lý của một vụ kiện có thể vượt xa những gì một áp phích cho trang web này có sẵn, đặc biệt nếu kẻ tấn công ở một quốc gia khác.
Paul Legato

0

Tôi nghĩ rằng nếu bạn làm cho nhiều người chơi trò chơi của bạn, đòi hỏi phải giữ logic trò chơi của bạn trong máy chủ, bạn có thể sẽ làm cho nó ít nhất là ít hấp dẫn hơn để đánh cắp. Bạn không thể tin tưởng khách hàng thực sự. Như ai đó đã đề cập, có những công cụ cho các ngôn ngữ được biên dịch như Java và Flash, có thể đảo ngược văn bản của mã từ mã byte.


-1

Bạn cần sử dụng Công cụ khai thác Javascript. Có rất nhiều lựa chọn có sẵn, hãy tìm một cái mà bạn thích. Để tiết kiệm cho bạn một số nghiên cứu tại đây, bạn có thể thử Yahoo Minifier . Tôi không tự mình chạy nhưng tôi cho rằng nó sẽ làm những gì bạn cần. Mục tiêu là 1) giảm kích thước tệp và 2) mã obfuscate. Điều này được thực hiện bằng cách loại bỏ tất cả các khoảng trắng, các bình luận và thay thế các tên biến bằng các tên ngắn hơn, vô nghĩa.

Hầu hết các ứng dụng web ngày nay đều có một lượng Javascript đáng kể và sử dụng các công cụ như những công cụ này để cố gắng bảo vệ IP của chúng. Như những người khác đã nói bạn nên luôn luôn hỏi, "Tôi có thể làm điều này trên máy chủ không?" cho các hoạt động quan trọng hoặc nhạy cảm, nhưng tôi tin rằng điều này sẽ cung cấp một số bảo vệ.


7
Bảo mật bằng cách che khuất che khuất tiềm năng cho an ninh. :)
Rushyo

1
Ôi làm ơn. Tôi nghe câu nói này mọi lúc nhưng nó hoàn toàn không đúng. Sự thật được nói che khuất JS ít nhất sẽ ngăn cản một số người.

2
Công cụ khai thác không giúp anh ta. Tôi tin rằng hầu hết những người "nghiêm túc" đều biết cách "mở rộng" các tập lệnh đó một lần nữa.
BerggreenDK

1
@Sergio: bạn nghe câu nói này mọi lúc bởi vì, bạn biết đấy, nó là sự thật . Nó sẽ răn đe "một số" người, đúng, nhưng răn đe "một số" người là vô nghĩa: khi bạn bị nứt một lần , bạn đi xuống.
o0 '.

-1

Sử dụng trình biên dịch đóng của Google http://code.google.com.vn/clenses/compiler/ Nó không chỉ là công cụ thu nhỏ js;)

Những lợi ích của việc sử dụng Trình biên dịch đóng cửa là gì?

  1. Hiệu quả. Trình biên dịch đóng cửa giảm kích thước tệp JavaScript của bạn và làm cho chúng hiệu quả hơn, giúp ứng dụng của bạn tải nhanh hơn và giảm nhu cầu băng thông của bạn.

  2. Kiểm tra mã. Trình biên dịch đóng cửa cung cấp các cảnh báo cho JavaScript bất hợp pháp và cảnh báo cho các hoạt động nguy hiểm tiềm tàng, giúp bạn tạo ra JavaScript ít lỗi hơn và dễ bảo trì hơn.1.


-1

Hoặc bạn có thể sử dụng một cái gì đó như Game Maker HTML5 để tạo trò chơi của bạn sẽ làm mờ mã cho bạn. Điều đó có nghĩa là nó sẽ làm cho mã không thể đọc được đối với con người. Và nó sẽ gần như không thể chỉnh sửa.


2
-1 Obfuscation sẽ chỉ đi xa như vậy. Nó chắc chắn sẽ không bảo vệ trò chơi khỏi bị sao chép hoặc thay đổi - như đã được đề cập trong các câu trả lời khó hiểu khác cho câu hỏi này.
doppelgreener

-1

Bất cứ điều gì độc quyền nên được giữ phía máy chủ. Phía khách hàng bạn chỉ cung cấp đủ cho nó để tạo điều kiện cho họ sử dụng trò chơi.


-1

Đặt mọi thứ trên máy chủ có thể có vấn đề về hiệu năng và không thực sự sử dụng tất cả tiềm năng của web như chúng ta biết ngày nay.

Bạn có thể viết mã của mình bằng c ++ và biên dịch mã thành nhị phân.

Khách hàng bản địa (NaCl).

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


Chào mừng đến với GDSE. OP đang hỏi về JavaScript cụ thể; vì vậy trong khi họ có thể có thể viết lại vào C ++ và sử dụng NaCl, giải pháp đó không thực sự giải quyết được nhu cầu như đã nêu. Ngoài ra, các câu trả lời phải được khép kín hết mức có thể - đề cập đến NaCl và hủy bỏ một liên kết không tốt bằng việc đưa ra một bản tóm tắt về NaCl là gì hoặc tại sao nó có thể giúp ích.
Pikalek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.