Làm cách nào tôi có thể che giấu (bảo vệ) JavaScript? [đóng cửa]


714

Tôi muốn tạo một ứng dụng JavaScript không phải là nguồn mở và do đó tôi muốn tìm hiểu cách làm xáo trộn mã JS của mình? Điều này có thể không?


15
Tôi rất muốn nghe lý do bạn đang cố gắng làm xáo trộn mã, nó có thể đưa ra một số bối cảnh cần thiết để đưa ra một câu trả lời hữu ích.
JohnFx

45
Cách duy nhất để thực sự giữ bí mật điều gì đó là không gửi nó cho khách hàng . Nếu họ không có nó, họ không thể đọc nó. Gửi nó được mã hóa chỉ là yêu cầu sự cố trong tay của một vài người thực sự quan tâm và mọi người khác sẽ không chọc ngoáy ngay cả khi bạn gửi nó rõ ràng (cf DRM).
Donal Fellows


8
Làm xáo trộn mã của bạn không phải là một ý tưởng tốt. Nó sẽ chỉ gây bất tiện cho người dùng hợp pháp (ví dụ: khi họ cần sửa lỗi) và không làm gì để 'bảo vệ' nó khỏi những người có động cơ (tài chính) để thiết kế ngược lại. Về cơ bảnkhông thể ngăn chặn kỹ thuật đảo ngược của mã Javascript.
Sven Slootweg

14
Cuộc tranh cãi không làm xáo trộn dường như là thiếu sót đối với tôi. Trừ khi bạn thực sự nghĩ rằng người dùng của bạn có thể sửa / báo cáo lỗi, thì bạn nên làm điều đó. Nó có thể giảm thời gian tải bằng cách giảm thiểu. Nó sẽ không bao giờ ngăn chặn một hacker thực sự tận tâm, nhưng nó sẽ làm chậm anh ta / cô ta và nó sẽ ngăn chặn các nỗ lực hack một nửa. Việc này rất dễ thực hiện và có nhiều công cụ (xem các câu trả lời khác), tôi nói chắc chắn làm điều đó vì hầu hết thời gian chỉ có lợi thế, nhưng đừng hy vọng nó mang lại sự bảo mật thực sự hoặc ngăn chặn ai đó sao chép mã của bạn nếu họ thực sự muốn Cách duy nhất để làm điều này là giữ phía máy chủ mã và sử dụng ajax.
Benjamin

Câu trả lời:


405

Obfuscation:

Hãy thử máy nén YUI . Đây là một công cụ rất phổ biến, được xây dựng, nâng cao và duy trì bởi nhóm Yahoo UI.

Bạn cũng có thể sử dụng:

CẬP NHẬT: Câu hỏi này ban đầu được hỏi hơn 10 năm trước và YUI không còn được duy trì. Trình biên dịch đóng cửa của Google vẫn đang được sử dụng và UglifyJS có thể được chạy cục bộ thông qua trình quản lý gói nút:npm install -g uglify-js

Dữ liệu chuỗi riêng:

Giữ các giá trị chuỗi riêng tư là một mối quan tâm khác và việc che giấu sẽ không thực sự mang lại nhiều lợi ích. Tất nhiên, bằng cách đóng gói nguồn của bạn vào một mớ hỗn độn bị cắt xén, bạn có một phiên bản bảo mật nhẹ thông qua che khuất . Hầu hết thời gian, đó là người dùng của bạn đang xem nguồn và các giá trị chuỗi trên máy khách được dành cho mục đích sử dụng của họ, do đó, loại giá trị chuỗi riêng tư thường không cần thiết.

Nếu bạn thực sự có một giá trị mà bạn không bao giờ muốn người dùng nhìn thấy, bạn sẽ có một vài lựa chọn. Đầu tiên, bạn có thể thực hiện một số loại mã hóa, được giải mã khi tải trang. Đó có thể là một trong những lựa chọn an toàn nhất, nhưng cũng có rất nhiều công việc có thể không cần thiết. Bạn có thể có thể mã hóa base64 một số giá trị chuỗi và điều đó sẽ dễ dàng hơn .. nhưng ai đó thực sự muốn các giá trị chuỗi đó có thể dễ dàng giải mã chúng . Mã hóa là cách duy nhất để thực sự ngăn chặn bất kỳ ai truy cập dữ liệu của bạn và hầu hết mọi người thấy rằng bảo mật hơn mức họ cần.

Sidenote:

Obfuscation trong Javascript đã được biết là gây ra một số lỗi. Các obfuscators đang trở nên tốt hơn một chút về nó, nhưng nhiều trang phục quyết định rằng họ thấy đủ lợi ích từ việc giảm thiểugzipping , và tiết kiệm thêm của obfuscation không phải lúc nào cũng đáng để lo lắng . Nếu bạn đang cố gắng bảo vệ nguồn của mình, có thể bạn sẽ quyết định rằng nó đáng để bạn sử dụng, chỉ để làm cho mã của bạn khó đọc hơn. JSMin là một lựa chọn tốt.


32
Tôi muốn thêm rằng việc thực hiện mã hóa base64 sẽ không có lợi cho bảo mật, vì đó là một thủ tục có thể đảo ngược tầm thường. Ngay cả việc mã hóa nó cũng không giúp ích gì nếu nó được giải mã phía máy khách. Cách duy nhất để đảm bảo an toàn cho chuỗi là CHỈ khách hàng nhìn thấy chuỗi được mã hóa và nó được chuyển đến
Claudiu

16
máy chủ để xử lý thêm.
Claudiu

9
FYI, máy nén YUI trực tuyến có thể được tìm thấy ở đây: refresh-sf.com/yui
mtness

7
Mã hóa các giá trị chuỗi sẽ chỉ mang lại lợi ích hơn một chút so với mã hóa base64, nếu chúng phải được giải mã bởi trình duyệt để sử dụng chúng. Lý do là bạn cũng sẽ phải cung cấp cho trình duyệt khóa mã hóa và bất cứ điều gì trình duyệt cũng có thể làm cho người dùng cũng có thể làm được.
Ben

9
Khi tôi thực hiện việc thu nhỏ bằng Máy nén YUI, tôi đảm bảo rằng nó sử dụng các phương pháp thu nhỏ "an toàn", tức là nó giữ dấu chấm phẩy --preserve-semi. Viết lại các biến riêng tư thành a, b, c vv thường là an toàn. Một điều khác tôi làm là làm cho trình khai thác đặt dấu ngắt dòng sau mỗi dấu chấm phẩy trong mã --line-break 0. Sau đó, trong sản xuất nếu có lỗi, tôi ít nhất có một dòng tham chiếu hợp lệ để làm việc và có thể tìm thấy mã đó trong bản sao phát triển của mình. Nếu không, bạn sẽ chỉ gặp một lỗi trên một dòng mã lớn và không biết lỗi đó ở đâu.
zuallauz

136

Tôi ngạc nhiên không ai nhắc đến Trình biên dịch đóng cửa của Google . Nó không chỉ thu nhỏ / nén, nó phân tích để tìm và loại bỏ mã không sử dụng và viết lại để thu nhỏ tối đa. Nó cũng có thể kiểm tra kiểu và sẽ cảnh báo về lỗi cú pháp.

JQuery gần đây đã chuyển từ Trình nén YUI sang Trình biên dịch đóng và thấy " sự cải tiến vững chắc "


60
có, nhưng gần đây họ đã rời khỏi trình biên dịch đóng cửa và hiện đang sử dụng UglifyJS. Mã JQuery đã bị lỗi sau khi nén bằng trình biên dịch đóng
Chielus

Tôi muốn lưu ý rằng, nếu bạn làm việc với góc cạnh. công cụ này sẽ không thực sự hoạt động vì tiêm phụ thuộc và đổi tên đối số, trừ khi có hộp kiểm tôi không thể thấy.
iConnor

1
Công cụ hữu ích, nhưng nó không làm xáo trộn, đó có lẽ là lý do tại sao không ai khác đã đề cập đến nó.
Madbreaks

1
@Madbreaks với Tối ưu hóa nâng cao ( developers.google.com/clenses/compiler/docs/api-tutorial3 ) nó sẽ thu nhỏ mã đến điểm bị xáo trộn. Các biến có thể được đổi tên thành ngắn gọn.
Jason Hall

Google cũng không phải là một tùy chọn để bảo mật
Fillipo Sniper

121

Obfuscation không bao giờ có thể thực sự làm việc. Đối với bất kỳ ai thực sự muốn nhận mã của bạn, đó chỉ là một cú hích tốc độ. Tồi tệ hơn, nó ngăn người dùng của bạn sửa lỗi (và gửi lại các bản sửa lỗi cho bạn) và khiến bạn khó chẩn đoán các vấn đề trong lĩnh vực này. Thật lãng phí thời gian và tiền bạc của bạn.

Nói chuyện với một luật sư về luật sở hữu trí tuệ và các lựa chọn pháp lý của bạn là gì. "Nguồn mở" không có nghĩa là "mọi người có thể đọc nguồn". Thay vào đó, Nguồn mở là một mô hình cấp phép cụ thể cấp quyền tự do sử dụng và sửa đổi mã của bạn. Nếu bạn không cấp giấy phép như vậy thì mọi người sao chép mã của bạn đều vi phạm và (ở hầu hết thế giới), bạn có các tùy chọn pháp lý để ngăn chặn chúng.

Cách duy nhất bạn thực sự có thể bảo vệ mã của mình là không gửi nó. Di chuyển phía máy chủ mã quan trọng và để mã Javascript công khai của bạn thực hiện các cuộc gọi Ajax tới nó.

Xem câu trả lời đầy đủ của tôi về obfuscators ở đây.


14
+1 trên Luật sư, nhưng điều đó có thể không hoạt động ở các quốc gia / khu vực tài phán khác.
jmort253

16
Luật sư có thể tạo ra nhiều chi phí / vấn đề hơn mã bị mất, suy nghĩ rất cẩn thận và sắp xếp nhiều tiền để lôi kéo luật sư !!
andora

11
-1: Tôi tin rằng việc tìm một luật sư hiểu JavaScript sẽ khó khăn ... Không đề cập đến các khoản phí và lượng thời gian cần thiết để tìm "kẻ vi phạm". Ai đó thực sự có thể vi phạm giấy phép bị chôn vùi trong các tệp HTML / JavaScript nếu anh ta không bao giờ ký bất cứ điều gì? +1 cho các cuộc gọi AJAX.
Alerty

12
@Alerty 1) Về cơ bản, giấy phép là về việc cấp quyền sử dụng tài liệu có bản quyền. Bạn có ít quyền sử dụng nó mà không có giấy phép. Bạn không cần phải ký tên để có quyền. Giấy phép khác với hợp đồng. 2a) Vì câu hỏi là về việc mọi người sao chép và sử dụng HTML / Javascript mà không được phép, nên giấy phép không bị "chôn vùi", nó nằm ngay trên điều đang được thực hiện. 2b) Bạn có ít quyền sử dụng tài liệu có bản quyền của người khác mà không cần giấy phép. 3) Luật sư không cần hiểu Javascript, chỉ cần luật sở hữu trí tuệ.
Schwern

4
@Alerty Đừng tỏ ra khó hiểu. Đây là về việc trừng phạt những người sao chép tệp để sử dụng trên trang web của họ mà không được phép. Những gì bạn đang nói là một hợp đồng, không phải là giấy phép. Hợp đồng đòi hỏi phải có sự đồng ý lẫn nhau và là cho và nhận. Giấy phép cấp cho bạn quyền sử dụng tài sản trí tuệ. Giấy phép là một cách (chủ sở hữu đang cấp cho bạn mọi thứ), bạn không bắt buộc phải ký vì bạn không cho đi bất cứ thứ gì. Nhiều "Thỏa thuận cấp phép phần mềm" thực sự là hợp đồng vì chúng vượt ra ngoài việc cấp phép tài sản và đôi khi thành những điều vô lý như quyền khởi kiện.
Schwern

49

Bạn có thể làm xáo trộn nguồn javascript theo tất cả những gì bạn muốn, nhưng nó sẽ luôn có thể được thiết kế ngược chỉ nhờ vào việc yêu cầu tất cả mã nguồn thực sự chạy trên máy khách ... tùy chọn tốt nhất tôi có thể nghĩ đến là xử lý xong với mã phía máy chủ và tất cả mã javascript của máy khách sẽ gửi yêu cầu xử lý đến chính máy chủ. Nếu không, bất cứ ai cũng sẽ luôn có thể theo dõi tất cả các hoạt động mà mã đang thực hiện.

Có người đã đề cập đến cơ sở64 để giữ cho chuỗi an toàn. Đây là một ý tưởng khủng khiếp. Base64 có thể được nhận ra ngay lập tức bởi các loại người muốn đảo ngược mã của bạn. Điều đầu tiên họ sẽ làm là giải mã nó và xem nó là gì.


45
Bất cứ nơi nào tôi đi, câu trả lời phổ biến nhất cho "làm thế nào tôi có thể làm xáo trộn Javascript của tôi?" là "bạn không nên lo lắng về điều đó bởi vì ai đó có thể không làm phiền nó." Đây không thực sự là một câu trả lời.
Travis Wilson

2
@Vivek: Hơi muộn một chút, nhưng điều tôi thực sự muốn nói là "mã phía máy chủ". Có thể chạy javascript không phải trên trình duyệt, chỉ trên máy chủ, nhưng tôi không biết mức độ phổ biến của nó.
Claudiu

8
@Travis: Tôi không nói "bạn không nên lo lắng về điều đó." Tôi chỉ nói rằng nếu bạn muốn một chương trình nguồn đóng, bạn sẽ không muốn viết nó trong javascript phía máy khách, bởi vì bất kỳ sự xáo trộn nào bạn làm sẽ không ngăn chặn nó (khá dễ dàng) được thiết kế ngược.
Claudiu

8
Đúng. Mà không có cách nào trả lời "làm thế nào tôi có thể làm xáo trộn JavaScript của tôi". Obfuscation không phải là một khái niệm trừu tượng, nó là một khái niệm kỹ thuật. Các op chỉ đơn giản hỏi "làm thế nào?"
Madbreaks

2
@Madbreaks: Câu hỏi đặt ra là trong bối cảnh không làm cho mã của anh ấy trở thành nguồn mở. Câu trả lời kỹ thuật ngay lập tức là câu trả lời được chấp nhận, nhưng câu trả lời trong ngữ cảnh tốt hơn (như trong, bạn thực sự đang cố gắng làm gì?) Là, IMO, rằng bạn không thể có javascript phía máy khách không phải là nguồn mở, bởi vì mọi người đều có nguồn, bất kể bạn che giấu nó như thế nào. Cả hai câu trả lời đều ở đây và mọi người có thể đọc và hưởng lợi từ cả hai.
Claudiu

45

Có một số công cụ mã hóa JavaScript được cung cấp miễn phí; tuy nhiên, tôi nghĩ điều quan trọng cần lưu ý là rất khó để làm xáo trộn JavaScript đến mức không thể thiết kế ngược.

Cuối cùng, có một số tùy chọn mà tôi đã sử dụng ở một mức độ nào đó:

  • Máy nén YUI . Trình nén JavaScript của Yahoo thực hiện tốt công việc cô đọng mã sẽ cải thiện thời gian tải của nó. Có một mức độ nhỏ của obfuscation hoạt động tương đối tốt. Về cơ bản, Compressor sẽ thay đổi tên hàm, xóa khoảng trắng và sửa đổi các biến cục bộ. Đây là những gì tôi sử dụng thường xuyên nhất. Đây là một công cụ dựa trên Java mã nguồn mở.

  • JSMin là một công cụ được viết bởi Douglas Crockford nhằm tìm cách thu nhỏ nguồn JavaScript của bạn. Nói theo cách riêng của Crockford, "JSMin không làm xáo trộn, nhưng nó làm xấu đi." Mục tiêu chính của nó là thu nhỏ kích thước nguồn của bạn để tải nhanh hơn trong trình duyệt.

  • Obfuscator JavaScript miễn phí . Đây là một công cụ dựa trên web cố gắng làm xáo trộn mã của bạn bằng cách thực sự mã hóa nó. Tôi nghĩ rằng sự đánh đổi của hình thức mã hóa (hoặc obfuscation) của nó có thể đến với chi phí của fileize; tuy nhiên, đó là vấn đề sở thích cá nhân.


19
Vì mã Javascript phải chạy trên máy của khách hàng, không khó để làm xáo trộn đến mức mã không thể đảo ngược được thiết kế nhưng không thể .
Schwern

20
đó là về thống kê. ngưỡng mà ai đó sẽ có quyền truy cập vào mã của bạn ở chế độ obfuscation và không có? họ vẫn có thể có quyền truy cập, nhưng ngưỡng càng cao thì càng ít người. càng ít người biết về một cái gì đó, thì cái đó càng an toàn. tiêu chuẩn thực hành phân loại an ninh.
Cris Stringfellow

1
Tìm kiếm / thay thế @PeterR trong trình soạn thảo văn bản sẽ khiến cuộc sống của bạn trở nên khó khăn hơn nhiều khi cố gắng đọc nó hoặc thiết kế ngược lại. nó không hoàn hảo, nhưng có thêm một lớp phiền toái / khó khăn bằng cách loại bỏ các manh mối bối cảnh. hầu hết các lập trình viên không thông minh như bạn, đó là điều làm cho điều này trở thành một công cụ răn đe tuyệt vời.
SED

1
@SED Tôi không biết một lập trình viên duy nhất không thể tìm / thay thế một loạt các [ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]vars thành ít nhất [var1, var2,..]trong một phút. Tôi có thể khử chữ, tái thụt lề và tìm kiếm / thay thế tên var trong vòng hai phút. Và không, tôi thông minh hơn một Dev trung bình. Thực tế đơn giản là, KHÔNG có cách nào để che khuất JS phía máy khách. Bạn có thể tự mua 5 phút, MAX, nhưng không được. Công cụ này thực sự chỉ để bán cho một người không biết mã về "Bảo mật" được thêm vào. Không ai đã từng viết một dòng JS sẽ mua thứ tào lao đó.
Peter R

3
@PeterR "Tôi có thể theo nghĩa đen de-làm xấu đi, tái-indent, và tìm kiếm / thay thế các tên var trong vòng hai phút" - chắc chắn, đi trước và thử rằng trên một vượt qua đa minified, obfuscated, 20MB codebase bó với một cấu trúc mà mất tuần để hiểu ngay cả với mã nguồn gốc, nhận xét. Và để làm cho nó thậm chí còn khó hơn, các công cụ che giấu tồn tại mà cố tình làm cho mã của bạn bị hỏng nếu thụt dòng, dòng, v.v.
John Weisz

23

Tôi sẽ làm gì:

A. Troll các hacker!

Đây sẽ là phần thứ hai mã javascript bí mật giả mạo / bị xáo trộn của tôi LAUNCHER. Một trong những bạn nhìn thấy trong mã nguồn.

Mã này là gì?

  1. tải mã thật
  2. đặt tiêu đề tùy chỉnh
  3. gửi một biến tùy chỉnh

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. Làm xáo trộn mã một chút

Đó là gì?

  1. đó là mã giống như trên trong cơ sở64
  2. đây không phải là mã javascript

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

C Tạo một tệp php khó hiển thị với mã thực bên trong

Mã php này là gì?

  1. Kiểm tra đúng người giới thiệu (tên miền / thư mục / mã của trình khởi chạy của bạn)
  2. Kiểm tra các tiêu đề tùy chỉnh
  3. Kiểm tra biến POST tùy chỉnh

Nếu mọi thứ đều ổn, nó sẽ hiển thị cho bạn đúng mã khác mã giả hoặc cấm ip, đóng trang .. bất cứ điều gì.

<?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=';
};
?>

người giới thiệu cơ sở64 = http://here.is/my/launcher.html

BÍ MẬT javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

FAKE = window.open('', '_self', '');window.close();

Bây giờ .. nếu bạn xác định trình xử lý sự kiện trong javascript SECRET thì có thể truy cập được .. bạn cần xác định chúng bên ngoài bằng mã khởi chạy và trỏ đến chức năng SECRET lồng nhau.

VẬY ... có cách nào dễ dàng để lấy mã không? document.body.appendChild(document.createElement('div')).innerText='Awesome';

Tôi không chắc chắn nếu điều này hoạt động nhưng tôi đang sử dụng chrome và các yếu tố, Tài nguyên, Mạng, Nguồn, Dòng thời gian, Hồ sơ, Kiểm toán nhưng tôi đã không tìm thấy dòng trên.

lưu ý1: nếu bạn mở url Troll.php từ phần tử Inspect-> trong chrome, bạn sẽ nhận được mã giả.

lưu ý2: toàn bộ mã được viết cho các trình duyệt hiện đại. polyfill cần nhiều mã hơn.

BIÊN TẬP

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
oh và vâng tôi cũng sẽ làm xáo trộn mã javascript.
cocco

1
Đây là một cái gì đó tôi chỉ nghĩ về, troll các cracker. Tôi muốn thấy một cái gì đó như thế này mà không phải sử dụng PHP :)
pgarciacamou

6
Ngay cả khi điều này là buồn cười, một nhà phát triển web có thể kiểm tra trang web đúng cách, bằng cách nào đó có thể lấy mã nguồn. Tôi thực sự nghĩ rằng không có cách nào để che giấu bất kỳ loại dữ liệu nào tại thời điểm bạn đưa nó lên mạng.
cocco

Nó không phải là bất kỳ loại obfuscation tôi nghĩ. Tuy nhiên, biết cách mở giao diện điều khiển, anh ta cũng có thể biết về mã hóa / giải mã cơ sở64, rất đơn giản.
T.Todua

19

Hãy thử mã hóa . Tôi đã cho nó một spin gần đây và đã bị ấn tượng bởi nó. Nó cung cấp một bộ các mẫu để che giấu với các cài đặt được xác định trước cho những người không quan tâm nhiều đến các chi tiết và chỉ muốn thực hiện nhanh chóng. Bạn cũng có thể tạo obfuscation tùy chỉnh bằng cách chọn bất kỳ biến đổi / kỹ thuật nào bạn muốn.


7
Thuê bao JScrambler rất đắt tiền ... Thuê bao rẻ nhất yêu cầu tối thiểu 3 tháng giá $ 145 - thật điên rồ.
barbushin

1
Bây giờ họ có một kế hoạch miễn phí. Các kế hoạch đăng ký khác vẫn còn đó.
user7610

2
Gói miễn phí chỉ bao gồm tối ưu hóa và tối thiểu hóa.
Jean Hominal

1
"Gói miễn phí bao gồm tối ưu hóa và tối thiểu hóa", vâng không. Xin lỗi và tối ưu hóa không đi cùng nhau, xin lỗi.
NiCk Newman

2
Nhìn vào trang web của JScrambler hôm nay và nhiều kế hoạch định giá khác, tôi không thể thấy một tùy chọn miễn phí. Chỉ dùng thử miễn phí ..
KDT

18

Vấn đề với các ngôn ngữ được dịch, là bạn gửi nguồn để chúng hoạt động (trừ khi bạn có trình biên dịch sang mã byte, nhưng sau đó, một lần nữa, việc dịch ngược lại khá đơn giản).

Vì vậy, nếu bạn không muốn hy sinh hiệu suất, bạn chỉ có thể hành động theo tên biến và hàm, vd. thay thế chúng bằng a, b ... aa, ab ... hoặc a101, a102, v.v. Và, tất nhiên, loại bỏ càng nhiều không gian / dòng mới càng tốt (đó là những gì được gọi là máy nén JS).
Các chuỗi obfuscating sẽ có một hiệu suất, nếu bạn phải mã hóa chúng và giải mã chúng trong thời gian thực. Ngoài ra, trình gỡ lỗi JS có thể hiển thị các giá trị cuối cùng ...


17

Trái với hầu hết các câu trả lời khác mà tôi đề xuất đối với YUI Compressor; bạn nên sử dụng Google Đóng .

Không nhiều vì nó nén nhiều hơn, nhưng chủ yếu là vì nó sẽ bắt lỗi javascript như a = [1,2,3,];làm cho IE trở nên haywire.


5
Không nên kiểm tra mã của bạn chống lại lỗi và không tương thích được thực hiện theo cách nào trước khi làm xáo trộn ?? thực sự không liên quan gì đến việc che
giấu

13

Một ứng dụng dựa trên Javascript không phải là nguồn mở khá ngớ ngẩn. Javascript là ngôn ngữ được giải thích phía máy khách .. Obfuscation không được bảo vệ nhiều ..

Mã hóa thường được thực hiện để giảm kích thước của tập lệnh, thay vì "bảo vệ" nó. Nếu bạn đang ở trong một tình huống mà bạn không muốn mã của mình được công khai, Javascript không phải là ngôn ngữ phù hợp ..

Có rất nhiều công cụ xung quanh, nhưng hầu hết đều có từ "máy nén" (hoặc "công cụ khai thác") trong tên của nó vì một lý do ..


11

Bạn không thể bảo mật mã phía máy khách: chỉ cần nhấn F12 trên Google Chrome, tạm dừng thực thi javascript và bạn sẽ nhận được tất cả các chuỗi, ngay cả những chuỗi được mã hóa. Làm đẹp nó và đổi tên các biến và bạn sẽ nhận được gần như mã gốc.

Nếu bạn đang viết javascript phía máy chủ (tức là NodeJS) sợ ai đó xâm nhập vào máy chủ của bạn và muốn làm cho hacker hoạt động khó khăn hơn, hãy cho bạn thêm thời gian để lấy lại quyền truy cập, sau đó sử dụng trình biên dịch javacript :

Bạn cần sử dụng Trình biên dịch đóng trên Trình biên dịch nâng cao, vì đây là công cụ duy nhất đổi tên tất cả các biến của bạn, ngay cả khi các biến đó được sử dụng trong nhiều tệp / mô-đun. Nhưng nó chỉ có một vấn đề: nó chỉ hoạt động nếu bạn viết theo kiểu mã hóa .


Compilng đóng cửa không phải là mã gây khó chịu: P
NiCk Newman

1
Nó không được tạo ra cho nó, nhưng hoạt động tốt: nó không thêm mã như một số trình biên dịch (thường có thể đảo ngược mà các công cụ tôi đã trích dẫn) nhưng thay đổi nó thành các cách không phổ biến, một số thậm chí khó hoàn tác và loại bỏ không sử dụng mã, so với obfuscation thực sự là tốt cho hiệu suất.
Gustavo Coleues

1
Không phải là một ý tưởng tốt. Giảm thiểu / biên dịch mã phía máy chủ có thể gây ra sự cố bảo mật nếu trình khai thác có lỗi: zyan.scripts.mit.edu/blog/backdooring-js
mgol

Lỗi bạn đã trích dẫn chỉ áp dụng cho UglifyJS: nó không áp dụng cho Trình biên dịch đóng.
Gustavo

Đối với tất cả những người quan tâm đến việc thu nhỏ các tệp javascript, đó cũng là một công cụ khai thác javascript. Vì vậy, tôi không nghĩ rằng đó là một lớp bảo mật hoàn toàn
Fillipo Sniper

11

Tôi có thể đề xuất Tiện ích JavaScript của Patrick J. O'Neil. Nó có thể obfuscate / compact và nén và có vẻ như nó khá tốt ở những thứ này. Điều đó nói rằng, tôi chưa bao giờ thử tích hợp nó trong một kịch bản xây dựng dưới bất kỳ hình thức nào.

Đối với obfuscating so với minifying - tôi không phải là một fan hâm mộ lớn của trước đây. Nó không thể gỡ lỗi (Lỗi ở dòng 1 ... "chờ đã, chỉ có một dòng") và họ luôn mất thời gian để giải nén. Nhưng nếu bạn cần ... tốt.


1
Nhưng obfuscating không nhất thiết phải nén nó thành một dòng, nó có thể đơn giản như thay đổi hàm và tên biến hoặc chuyển đổi chuỗi thành base64. Giảm thiểu đặt tất cả các mã trên một dòng.
rw-nandemo

Ngày nay UglifyJS dường như là sự lựa chọn tốt nhất. Tác giả cũng là một chàng trai tuyệt vời! :)
Tsvetomir Tsonev 17/2/2016

Về gỡ lỗi, bạn hầu như có thể tạo ra các tài liệu mà bạn có thể đưa vào khi kiểm tra để bạn có thể thấy lỗi nào xảy ra trên dòng nào, ngay cả khi nó được giảm thiểu.
Luca Steeb

5

Tôi sẽ đề xuất giảm thiểu đầu tiên với một cái gì đó như YUI Compressor, sau đó chuyển đổi tất cả các chuỗi và số thành Giá trị HEX bằng cách sử dụng một cái gì đó như http://www.javascriptobfuscator.com/

Với điều này, mã sẽ được hiển thị gần như không thể hiểu được và tôi nghĩ ở Giai đoạn này sẽ mất nhiều thời gian hơn để Hacker tái hiện mã của bạn hơn thực tế nếu anh ta viết lại từ đầu. Viết lại và nhân bản là những gì bạn không thể thực sự dừng lại. Sau tất cả, chúng ta là những người tự do!


5

Dean Edward's Packer là một trình giải mã tuyệt vời, mặc dù nó chủ yếu làm xáo trộn mã, không phải bất kỳ thành phần chuỗi nào bạn có thể có trong mã của mình.

Xem: Công cụ nén Javascript trực tuyến và chọn Trình đóng gói (Dean Edwards) từ danh sách thả xuống


Nó là vô nghĩa. Nó có thể được giải nén dễ dàng với jsbeautifier.org
Maciej

4

Tôi có ấn tượng rằng một số doanh nghiệp (ví dụ: JackBe) đặt mã JavaScript được mã hóa bên trong các tệp * .gif, chứ không phải các tệp JS, như một biện pháp bổ sung.


4

Hãy thử công cụ này Obfuscator Javascript

Tôi đã sử dụng nó trên trò chơi HTML5 của mình, nó không chỉ giảm kích thước từ 950KB xuống còn 150 mà còn làm cho trình biên dịch đóng cửa không thể đọc được và mã khai thác có thể đảo ngược. Cá nhân tôi không biết làm thế nào để đảo ngược sự xáo trộn này.


4

Tôi đã sử dụng Jasob trong nhiều năm và đây là công cụ hỗ trợ tốt nhất hiện có.
Nó có một giao diện người dùng nâng cao nhưng vẫn trực quan và dễ sử dụng.
Nó cũng sẽ xử lý các tệp HTML và CSS.

Cách tốt nhất để sử dụng nó là tiền tố tất cả các biến riêng tư của bạn với một cái gì đó giống như dấu gạch dưới, sau đó sử dụng sorttính năng này để nhóm tất cả chúng lại với nhau và kiểm tra chúng như là mục tiêu để che giấu.

Người dùng vẫn có thể xem mã nguồn của bạn, nhưng đó là nhiều khó khăn hơn để giải mã khi biến tin của bạn được chuyển đổi từ một cái gì đó như _sUserPreferredNickNameđể a.

Công cụ sẽ tự động kiểm đếm số lượng biến được nhắm mục tiêu và ưu tiên chúng để có được mức nén tối đa.

Tôi không làm việc cho Jasob và tôi không nhận được gì từ việc quảng bá chúng, chỉ đưa ra một số lời khuyên thân thiện.
Nhược điểm là nó không miễn phí và hơi đắt tiền, nhưng vẫn có giá trị khi được xếp chồng lên các lựa chọn thay thế - các tùy chọn 'miễn phí' thậm chí không đến gần.


Jason dường như là một công cụ khai thác nhỏ hơn là một obfuscator. Tui bỏ lỡ điều gì vậy?
Alan McBee - MSFT

4

Bạn đã thử dùng Tunascript ? Nó tạo ra mã nén cao và hoàn toàn không thể đọc được.


18
nó nén mã độc đáo, nhưng chỉ cần thay đổi eval()dòng cuối cùng console.log()và bảng điều khiển của bạn sẽ nhổ ra toàn bộ
Tôm hùm

4

Tôi đang sử dụng tiện ích Đóng cửa-Trình biên dịch để mã hóa tập lệnh java. Nó thu nhỏ mã và có nhiều tùy chọn hơn cho obfuscation. Tiện ích này có sẵn tại mã Google ở ​​bên dưới URL:
Công cụ đóng cửa

Nhưng bây giờ một ngày tôi đang nghe nhiều về UglifyJS. Bạn có thể tìm thấy sự so sánh khác nhau giữa Trình biên dịch đóng cửa và UglifyJS trong đó Uglify dường như là người chiến thắng.
UglifyJS: Trình nén JavaScript mới nhanh cho Node.js ngang với việc đóng cửa

Tôi sẽ sớm trao cơ hội cho UglifyJS.




2

Bạn chắc chắn nên xem xét việc xem Obfuscriptor .

Tôi vượt xa các thủ thuật rút gọn Javascript điển hình mà chúng tôi đã thấy từ các công cụ khác như Trình nén YUI hoặc Đóng cửa Google .

Mã obfuscated trông giống như được mã hóa. Không giống như bất cứ điều gì tôi đã thấy trước đây.


Cảm ơn các liên kết! Chỉ cần thử obfuscriptor và mã được mã hóa thực sự (không có khóa ???). Và nén tập lệnh của tôi từ 211 đến 36 Kb!

Lưu ý rằng Obfuscriptor cảnh báo bạn rằng nó không hoạt động với IE. Đó là một công cụ thỏa thuận cho một số.
Alan McBee - MSFT

1
Liên kết trên câu trả lời không trỏ đến công cụ nữa. Tôi không tìm thấy tài liệu tham khảo trực tiếp nào khác.
buzoherbert

liên kết đầu tiên đã chết. "Obfuscriptor"
Alp Altunel

2

Nếu bạn sử dụng thư viện JavaScript, hãy xem xét Bộ công cụ Dojo tương thích (sau khi sửa đổi nhỏ) với trình biên dịch chế độ Nâng cao của Trình biên dịch đóng.

Dojo - Thư viện JavaScript duy nhất tương thích với Trình biên dịch đóng

Mã được biên dịch với chế độ Đóng nâng cao gần như không thể thiết kế ngược, thậm chí chuyển qua trình làm đẹp, vì toàn bộ cơ sở mã (bao gồm cả thư viện) bị che khuất. Nó cũng nhỏ 25% trung bình.

Mã JavaScript chỉ đơn giản là được rút gọn (YUI Compressor, Uglify, v.v.) rất dễ để thiết kế ngược sau khi đi qua một trình làm đẹp.


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.