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?
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?
Câu trả lời:
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ểu và gzipping , 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.
--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.
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 "
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ó.
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ì.
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.
[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 đó.
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ì?
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ì?
(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ì?
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=';}; ?>
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.
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 ...
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.
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 ..
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 .
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.
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!
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
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.
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 sort
tí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.
Bạn đã thử dùng Tunascript ? Nó tạo ra mã nén cao và hoàn toàn không thể đọc được.
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ô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.
Là một trình nén / mã hóa JavaScript / HTML / CSS, bạn cũng có thể thử Patu Digua .
Điều này giảm bớt nhưng không làm phiền. Nếu bạn không muốn sử dụng dòng lệnh Java, bạn có thể dán javascript của mình vào một biểu mẫu web.
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.
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.
Tôi đã sử dụng điều này trong quá khứ, và nó làm một công việc tốt. Nó không miễn phí, nhưng bạn chắc chắn nên xem qua.
Bộ mã hóa & mã hóa JavaScript