Làm cách nào để ẩn mã javascript trong một trang web?


94

Có thể ẩn mã Javascript khỏi html của trang web khi mã nguồn được xem thông qua tính năng Xem nguồn của trình duyệt không?

Tôi biết có thể làm xáo trộn mã, nhưng tôi muốn nó bị ẩn khỏi tính năng nguồn xem.


1
nó ở phía máy khách và vì vậy nó sẽ nằm trên mọi máy khách (trình duyệt)
naveen 29/07/11

8
Tại sao bạn muốn ẩn Javascript? Nó không giống như bạn đã bao giờ đặt bất kỳ dữ liệu nhạy cảm nào mà bạn không muốn người dùng tìm thấy trong đó ... Đúng không ?!
Paul

1
Làm thế nào để một trình duyệt biết Javascript để chạy?
Wylie

1
@PaulPRO có một điểm hay - tại sao bạn lại muốn ẩn JavaScript? Bất kỳ ai muốn biết bạn đang làm gì LUÔN LUÔN có thể nhận được tập lệnh của bạn bằng một vài lần nhấn phím. Họ sẽ không chỉ dựa vào View-Source. Bất cứ ai không biết cách lấy một kịch bản có thể sẽ không hứng thú với nó.
Stephen Chung,

1
@UdayHiwarale Rất dễ dàng để xem GET và các truy vấn HTTP khác được thực hiện bởi máy khách là gì (chỉ cần mở bảng điều khiển dành cho nhà phát triển và chuyển đến tab mạng). Khi phát triển một trang web, bạn nên giả định trên máy chủ rằng tất cả các yêu cầu đều bị kẻ tấn công giả mạo - và do đó bạn phải xác thực tất cả dữ liệu và cẩn thận thoát mọi chuỗi mà bạn ghép vào SQL hoặc mã khác.
Suzanne Dupéron 21/12/16

Câu trả lời:


129

Tôi không chắc có ai khác thực sự giải quyết trực tiếp câu hỏi của bạn, đó là mã đang được xem từ lệnh View Source của trình duyệt.

Như những người khác đã nói, không có cách nào để bảo vệ javascript dự định chạy trong trình duyệt khỏi một người xem xác định. Nếu trình duyệt có thể chạy nó, thì bất kỳ người nào được xác định cũng có thể xem / chạy nó.

Tuy nhiên, nếu bạn đặt javascript của mình vào một tệp javascript bên ngoài được bao gồm với:

<script type="text/javascript" src="http://mydomain.com/xxxx.js"></script>

thì mã javascript sẽ không hiển thị ngay lập tức với lệnh View Source - chỉ bản thân thẻ script mới hiển thị theo cách đó. Điều đó không có nghĩa là ai đó không thể chỉ tải tệp javascript bên ngoài đó để xem nó, nhưng bạn đã hỏi làm thế nào để ngăn nó khỏi lệnh View Source của trình duyệt và điều này sẽ thực hiện được.

Nếu bạn muốn thực sự làm cho việc xem nguồn hoạt động hiệu quả hơn, bạn sẽ thực hiện tất cả những việc sau:

  1. Đặt nó vào một tệp .js bên ngoài.
  2. Làm xáo trộn tệp để hầu hết các tên biến gốc được thay thế bằng các phiên bản ngắn, để xóa tất cả các khoảng trắng không cần thiết, do đó không thể đọc được nếu không xử lý thêm, v.v.
  3. Tự động bao gồm tệp .js bằng cách thêm các thẻ tập lệnh (giống như Google Analytics). Điều này sẽ khiến việc truy cập mã nguồn từ lệnh View Source trở nên khó khăn hơn vì sẽ không có liên kết dễ dàng để nhấp vào đó.
  4. Đặt nhiều logic thú vị mà bạn muốn bảo vệ trên máy chủ mà bạn truy xuất thông qua lệnh gọi ajax thay vì xử lý cục bộ.

Với tất cả những gì đã nói, tôi nghĩ bạn nên tập trung vào hiệu suất, độ tin cậy và làm cho ứng dụng của bạn trở nên tuyệt vời. Nếu bạn hoàn toàn phải bảo vệ thuật toán nào đó, hãy đưa nó lên máy chủ, nhưng ngoài ra, hãy cạnh tranh để trở thành người giỏi nhất mà bạn làm, không phải bằng cách có bí mật. Dù sao thì đó cũng là cách thành công hoạt động trên web.


2
Cách tốt để giải quyết câu hỏi trực tiếp. Sử dụng JavaScript để tạo ra sự <script>sẽ giữ nó ra khỏi View Source tốt hơn (vẫn có thể nhìn thấy dưới DOM sống) - có nghĩa là, nó có thể không chỉ là "phải nhấp vào" trong Source View. Có thể <script>phần tử đã nói sẽ bị xóa khi JavaScript được thực thi, khiến nó hơi cồng kềnh hơn (nhưng không phải là không thể) để lấy mã gốc ... tất nhiên lưu lượng truy cập ròng sẽ hiển thị rất dễ dàng trong Firebug hoặc tương tự ;-)

3
@Quentin - URL nguồn xem của bạn thật ngớ ngẩn - đó không phải là những gì đang được yêu cầu hoặc đề xuất ở đây. Bất kỳ người nào cũng có thể xem mã. Tôi đã nói điều đó nhiều như bất kỳ ai khác. Câu hỏi chỉ là nó dễ dàng như thế nào và theo câu hỏi cụ thể được hỏi, nó hiển thị như thế nào khi ai đó xem Nguồn? Đề xuất của tôi làm cho nó bị xóa một bước khỏi View Source - chỉ có vậy, nhưng đó là một bước bổ sung hợp lệ.
jfriend00

fetch ("SCRIPT TO HIDE URL or DATAURL"). then (function (t) {return t.text () || false;}). then (c => self [atob ("ZXZhbA")] (c))
Zibri

Tôi nghĩ chúng ta có thể thêm oncontextmenu = 'return false;' trong thẻ html.
falero80s

@ falero80s - Điều đó cố gắng dừng menu nhấp chuột phải, nhưng không dừng tất cả các cách khác mà người ta có thể xem nguồn của trang.
jfriend00

38

Không, không thể.

Nếu bạn không đưa nó cho trình duyệt, thì trình duyệt không có nó.

Nếu bạn làm vậy, thì nó (hoặc một tham chiếu dễ theo dõi đến nó) sẽ tạo thành một phần của nguồn.


4
Tôi không chắc câu trả lời này thực sự trả lời được câu hỏi đang được hỏi (mặc dù nó đã nhận được 10 lượt ủng hộ trong 15 phút). Họ hỏi làm thế nào để giữ mã khỏi lệnh View Source của trình duyệt. Điều đó là có thể. Xem câu trả lời của tôi dưới đây. Họ không hỏi làm thế nào để giữ mã khỏi bị một tin tặc kiên quyết xem.
jfriend00

8
Không mất nhiều thời gian để xác định nhấp vào liên kết trong Nguồn xem cho tài liệu HTML để truy cập Nguồn xem cho tập lệnh.
Quentin

Theo quan điểm của tôi câu hỏi đã không được giải thích một cách chính xác. Tạo một tệp JS là phổ biến, điều người dùng muốn ở đây (tôi nghĩ) là làm thế nào để ẩn bất kỳ giá trị biến JS nào khi bất kỳ người nào chọn tùy chọn "xem nguồn trang". +1 từ phía tôi.
shaILU

Câu trả lời này không có ý nghĩa gì. tốt hơn là đưa ra một gợi ý ở đây. Tùy chọn tốt hơn để sử dụng tệp bên ngoài.
Lalit Mohan

14

Giải pháp của tôi được lấy cảm hứng từ nhận xét cuối cùng. Đây là mã của hidden.html

<script src="http://code.jquery.com/jquery-1.8.2.js"></script>
<script type="text/javascript" src="invisible_debut.js" ></script>
<body>
</body>

Mã rõ ràng của hidden_debut.js là:

$(document).ready(function () {
var ga = document.createElement("script"); //ga is to remember Google Analytics ;-)
ga.type = 'text/javascript';
ga.src = 'invisible.js';
ga.id = 'invisible';
document.body.appendChild(ga);
$('#invisible').remove();});

Lưu ý rằng ở phần cuối, tôi đang xóa tập lệnh đã tạo. vô hình.js là:

$(document).ready(function(){
    alert('try to find in the source the js script which did this alert!');
    document.write('It disappeared, my dear!');});

vô hình.js không xuất hiện trong bảng điều khiển vì nó đã bị xóa và không bao giờ có trong mã nguồn vì được tạo bởi javascript.

Liên quan đến hidden_debut.js, tôi đã nhầm lẫn nó, có nghĩa là rất phức tạp để tìm ra url của hidden.js. Không hoàn hảo, nhưng cũng khó đối với một hacker bình thường.


3
Điều kỳ lạ là tôi đã làm theo chính xác các bước và tôi có thể tìm thấy invisible.jstrong các nguồn. Phiên bản Chrome 34.0.1847.131 m
Boyang

1
@Boyang, nó chỉ không xuất hiện trong bảng điều khiển, nhưng nếu chúng ta biết đường dẫn, chúng ta vẫn có thể tìm thấy nó.
Panadol Chong

Không chỉ vậy, nó sẽ luôn hiển thị trong tab Mạng của hầu hết các DevTools. Một lần nữa, mỗi tin tặc tự trọng sẽ có sẵn DevTools.
GoldBishop

13

Sử dụng mã hóa Html Phần của đầu có

<link rel="stylesheet" href="styles/css.css" type="text/css" media="screen" />
<script type="text/javascript" src="script/js.js" language="javascript"></script>

copy and paste it to HTML Encrypter and the Result will goes like this
and paste it the location where you cut the above sample

<Script Language='Javascript'>
<!-- HTML Encryption provided by iWEBTOOL.com -->
<!--
document.write(unescape('%3C%6C%69%6E%6B%20%72%65%6C%3D%22%73%74%79%6C%65%73%68%65%65%74%22%20%68%72%65%66%3D%22%73%74%79%6C%65%73%2F%63%73%73%2E%63%73%73%22%20%74%79%70%65%3D%22%74%65%78%74%2F%63%73%73%22%20%6D%65%64%69%61%3D%22%73%63%72%65%65%6E%22%20%2F%3E%0A%3C%73%63%72%69%70%74%20%74%79%70%65%3D%22%74%65%78%74%2F%6A%61%76%61%73%63%72%69%70%74%22%20%73%72%63%3D%22%73%63%72%69%70%74%2F%6A%73%2E%6A%73%22%20%6C%61%6E%67%75%61%67%65%3D%22%6A%61%76%61%73%63%72%69%70%74%22%3E%3C%2F%73%63%72%69%70%74%3E%0A'));
//-->

HTML ENCRYPTOR Lưu ý: nếu bạn có tập lệnh java trong trang của mình, hãy thử xuất sang tệp .js và làm cho nó giống như ví dụ ở trên.

Và ngoài ra Mã hóa này không phải lúc nào cũng hoạt động trong một số mã sẽ làm cho trang web của bạn bị rối ... Chọn phần tốt nhất mà bạn muốn ẩn, chẳng hạn như trong <form> </form>

Điều này có thể được đảo ngược bởi người dùng trước nhưng không phải tất cả noob như tôi đều biết nó.

Hy vọng điều này sẽ giúp


3
Liên kết được cung cấp của bạn không được mở do lỗi mã 404.
Akash Limbani

Cách tiếp cận tương tự này là cách Hacker trang đưa mã độc vào một trang web. Một số công cụ Trình thu thập thông tin web bảo mật nâng cao hơn tìm kiếm mã như thế này và khử trùng nó ra khỏi nguồn trang.
GoldBishop

8

Tôi không chắc có cách nào để giấu thông tin đó. Bất kể bạn làm gì để làm xáo trộn hoặc ẩn bất cứ điều gì bạn đang làm trong JavaScript, thì thực tế là trình duyệt của bạn cần tải nó để sử dụng nó. Các trình duyệt hiện đại có các công cụ gỡ lỗi / phân tích web giúp việc trích xuất và xem các tập lệnh trở nên đơn giản ( F12chẳng hạn như trong Chrome).

Nếu bạn lo lắng về việc tiết lộ một số loại bí mật thương mại hoặc thuật toán, thì cách duy nhất của bạn là đóng gói logic đó trong một lệnh gọi dịch vụ web và yêu cầu trang của bạn gọi chức năng đó thông qua AJAX.


8

'Không thể!'

Ồ, là nó đấy ....

//------------------------------
function unloadJS(scriptName) {
  var head = document.getElementsByTagName('head').item(0);
  var js = document.getElementById(scriptName);
  js.parentNode.removeChild(js);
}


//----------------------
function unloadAllJS() {
  var jsArray = new Array();
  jsArray = document.getElementsByTagName('script');
  for (i = 0; i < jsArray.length; i++){
    if (jsArray[i].id){
      unloadJS(jsArray[i].id)
    }else{
      jsArray[i].parentNode.removeChild(jsArray[i]);
    }
  }      
}

4
Câu trả lời rất hay. Nó thực sự ẩn việc sử dụng javascript, tuy nhiên, chỉ khi bạn sử dụng Element Inspector / Developer Tools, bạn vẫn có thể thấy nếu bạn xem qua View Source. (Ít nhất trên chrome)
Patrick Bard

biến "head" có thừa ở đây không hay nó phục vụ một số chức năng quan trọng?
Master James

2
nó ẩn nó chỉ một phần ... bất kỳ chức năng tiếp xúc (toàn cầu) có thể được hiển thị bằng các công cụ dev và nó sẽ xuất hiện như là một chức năng ẩn danh nhưng công cụ dev cho bạn biết tất cả mọi thứ bao gồm cả nơi nó được nạp từ
Zibri

điều này chỉ ẩn nó khỏi nguồn .. một hàm bất thường sẽ làm tương tự: fetch ("SCRIPT TO HIDE"). then (function (t) {return t.text () || false;}). then (c = > self [atob ("ZXZhbA")] (c))
Zibri

5

Tôi nghĩ rằng tôi đã tìm thấy giải pháp để ẩn một số mã JavaScript nhất định trong nguồn xem của trình duyệt. Nhưng bạn phải sử dụng jQuery để làm điều này.

Ví dụ:

Trong index.php của bạn

<head>
<script language = 'javascript' src = 'jquery.js'></script>
<script language = 'javascript' src = 'js.js'></script>
</head>

<body>
<a href = "javascript:void(null)" onclick = "loaddiv()">Click me.</a>

<div id = "content">
</div>

</body>

Bạn tải một tệp trong phần thân html / php được gọi bởi một hàm jquery trong tệp js.js.

js.js

function loaddiv()
{$('#content').load('content.php');}

Đây là mẹo.

Trong tệp content.php của bạn, hãy đặt một thẻ head khác sau đó gọi một tệp js khác từ đó.

content.php

<head>
<script language = 'javascript' src = 'js2.js'></script>
</head>

<a href = "javascript:void(null)" onclick = "loaddiv2()">Click me too.</a>

<div id = "content2">
</div>

trong tệp js2.js tạo bất kỳ chức năng nào bạn muốn.

thí dụ:

js2.js

function loaddiv2()
{$('#content2').load('content2.php');}

content2.php

<?php
echo "Test 2";
?>

Vui lòng theo liên kết sau đó sao chép và dán nó vào tên tệp của jquery.js

http://dl.dropbox.com/u/36557803/jquery.js

Tôi hi vọng cái này giúp được.


Điều này sẽ chỉ cung cấp sự bảo vệ tối thiểu. Việc truy cập tab mạng của các công cụ dành cho nhà phát triển của trình duyệt và xem tất cả các tập lệnh đã tải xuống, bao gồm cả những tập lệnh được tải qua Ajax là điều không cần thiết.
JJJ

4

Bạn có thể sử dụng document.write.

Không có jQuery

<!DOCTYPE html>
<html>
<head><meta charset=utf-8></head>
<body onload="document.write('<!doctype html><html><head><meta charset=utf-8></head><body><p>You cannot find this in the page source. (Your page needs to be in this document.write argument.)</p></body></html>');">
</body></html>

Hoặc với jQuery

$(function () {
  document.write("<!doctype html><html><head><meta charset=utf-8></head><body><p>You cannot find this in the page source. (Your page needs to be in this document.write argument.)</p></body></html>")
});

2

Không có khả năng!

Cách duy nhất là làm xáo trộn javascript hoặc rút gọn javascript của bạn, điều này khiến người dùng cuối khó thiết kế ngược. tuy nhiên nó không phải là không thể thiết kế ngược lại.


1

Cách tiếp cận tôi đã sử dụng cách đây vài năm -

Chúng tôi cần một tệp jsp, một tệp java servlet và một tệp java bộ lọc.

Cấp quyền truy cập tệp jsp cho người dùng. Người dùng nhập url của tệp jsp.

Trường hợp 1 -

  • Tập tin jsp sẽ chuyển hướng người dùng đến Servlet.
  • Servlet sẽ thực thi phần tập lệnh cốt lõi được nhúng trong tệp xxxxx.js và
  • Sử dụng Printwriter, nó sẽ hiển thị phản hồi cho người dùng.

  • Trong khi đó, Servlet sẽ tạo một tệp khóa.

  • Khi servlet cố gắng thực thi tệp xxxx.js bên trong nó, Bộ lọc
    sẽ kích hoạt và sẽ phát hiện tệp khóa tồn tại và do đó xóa
    tệp khóa .

Như vậy một chu kỳ đã kết thúc.

Tóm lại, tệp khóa sẽ được tạo bởi máy chủ và sẽ bị xóa ngay lập tức bằng bộ lọc.

Điều này sẽ xảy ra sau mỗi cú đánh.

Trường hợp 2 -

  • Nếu người dùng cố gắng lấy nguồn trang và nhấp trực tiếp vào tệp xxxxxxx.js, Bộ lọc sẽ phát hiện tệp khóa đó không tồn tại.
  • Nó có nghĩa là yêu cầu không đến từ bất kỳ servlet nào. Do đó, nó sẽ chặn chuỗi yêu cầu.

Thay vì tạo tệp, người ta có thể sử dụng giá trị cài đặt trong biến phiên.

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.