如何在网页中隐藏JavaScript代码?

时间:2011-07-29 06:11:51

标签: javascript browser hide obfuscation

当通过浏览器查看源功能查看源代码时,是否可以从网页的html中隐藏Javascript代码?

我知道可以对代码进行模糊处理,但我希望它能够从视图源功能隐藏

12 个答案:

答案 0 :(得分:107)

我不确定其他人是否直接解决了您的问题,这是从浏览器的View Source命令中查看的代码。

正如其他人所说,没有办法保护打算在浏览器中运行的javascript来自确定的查看者。如果浏览器可以运行它,那么任何确定的人也可以查看/运行它。

但是,如果你把你的javascript放在一个随附的外部javascript文件中:

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

标签,然后使用“查看源”命令不会立即显示javascript代码 - 只有脚本标记本身才会以这种方式显示。这并不意味着有人不能只是加载外部javascript文件来查看它,但你确实问过如何将它保留在浏览器的View Source命令之外,这样就可以了。

如果您想真正让查看源代码更加有效,您可以执行以下所有操作:

  1. 将其放在外部.js文件中。
  2. 对文件进行模糊处理,以便将大多数原生变量名称替换为短版本,以便删除所有不需要的空格,因此无需进一步处理就无法读取等等...
  3. 通过以编程方式添加脚本标记(如Google Analytics一样)动态地包含.js文件。这将使得从View Source命令获取源代码变得更加困难,因为没有简单的链接可以点击那里。
  4. 在您通过ajax调用检索的服务器上放置要保护的有趣逻辑,而不是进行本地处理。
  5. 尽管如此,我认为您应该专注于性能,可靠性并使您的应用程序变得更好。如果你绝对必须保护一些算法,把它放在服务器上,但除此之外,竞争你做的最好,而不是有秘密。无论如何,这最终是成功在网络上运作的方式。

答案 1 :(得分:35)

不,这是不可能的。

如果您没有将它提供给浏览器,那么浏览器就没有它。

如果你这样做,那么它(或一个容易遵循的引用)构成了源的一部分。

答案 2 :(得分:13)

使用Html Encrypter Head的部分

<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 ENCRYPTER 注意:如果您的页面中有一个java脚本,请尝试导出到.js文件,并使其像上面的示例一样。

此外,这个加密器并不总是在一些会使你的网站搞砸的代码中工作...选择你想要隐藏的最佳部分,例如<form> </form>

这可以通过提前用户反向,但不是像我这样的所有菜鸟都知道。

希望这会有所帮助

答案 3 :(得分:10)

我的解决方案受到最后评论的启发。这是invisible.html的代码

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

invisible_debut.js的明确代码是:

$(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();});

请注意,最后我删除了创建的脚本。 invisible.js是:

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

invisible.js没有出现在控制台中,因为它已被删除,而且从未在源代码中出现,因为它是由javascript创建的。

关于invisible_debut.js,我对它进行了模糊处理,这意味着找到invisible.js的url非常复杂。不完美,但对普通黑客来说很难。

答案 4 :(得分:7)

我不确定是否有办法隐藏这些信息。无论你做什么来混淆或隐藏你在JavaScript中做的任何事情,它仍然归结为你的浏览器需要加载它才能使用它。现代浏览器具有开箱即用的Web调试/分析工具,使得提取和查看脚本变得微不足道(例如,在Chrome中点击 F12 )。

如果您担心会暴露某种商业秘密或算法,那么您唯一的办法就是将该逻辑封装在Web服务调用中,让您的页面通过AJAX调用该功能。

答案 5 :(得分:6)

'不可能!'

哦,是的,它是......

//------------------------------
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]);
    }
  }      
}

答案 6 :(得分:5)

您可以使用document.write

没有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>

或使用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>")
});

答案 7 :(得分:4)

我想我找到了一个隐藏浏览器视图源中某些JavaScript代码的解决方案。但你必须使用jQuery来做到这一点。

例如:

在index.php中

<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>

你在js.js文件中的jquery函数调用的html / php体中加载一个文件。

js.js

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

这就是诀窍。

在你的content.php文件中放入另一个头标记,然后从那里调用另一个js文件。

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>

在js2.js文件中创建你想要的任何函数。

示例:

js2.js

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

content2.php

<?php
echo "Test 2";
?>

请关注链接,然后将其粘贴到jquery.js

的文件名中

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

我希望这会有所帮助。

答案 8 :(得分:1)

不可能!

唯一的方法是混淆javascript或缩小你的javascript,这使最终用户难以进行逆向工程。然而,逆向工程并非不可能。

答案 9 :(得分:1)

这是可能的。但无论如何它是可见的。

您可以自己制作此工具:

<div id="container"></div>
const btn = document.querySelector('.btn');
btn.onclick = textRead;
const copy = document.querySelector('.copy');
copy.onclick = Copy;
const file = document.querySelector('.file');
file.type = 'file';
const pre = document.querySelector('.pre');

var pretxt = pre;

if (pre.innerHTML == "") {
    copy.hidden = true;
}

function textRead() {
    let file = document.querySelector('.file').files[0];
    let read = new FileReader();
    read.addEventListener('load', function(e) {
        let data = e.target.result;
        pre.textContent = data;
    });
    read.readAsDataURL(file);
    copy.hidden = false;
}

function Copy() {
    var text = pre;
    var selection = window.getSelection();
    var range = document.createRange();
    range.selectNodeContents(text);
    selection.addRange(range);
    document.execCommand('copy');
    selection.removeAllRanges();
}

如何使用这个工具?

  1. 创建一个 JavaScript 文件。
  2. 进入工具并选择您的 JavaScript 文件。
  3. 复制结果。
  4. 将结果粘贴到记事本中。
  5. 删除<input class="file" /> <br> <button class="btn">Read File</button> <pre class="pre"></pre> <button class="copy">Copy</button>
  6. data:text/javascript;base64, 粘贴到您的代码并将 eval(atob('Notepad Text')) 更改为您的记事本文本结果。

如何查看此隐藏代码?

  1. 复制隐藏的代码并将其粘贴到记事本中。
  2. 复制一个在 eval 和 atob 之后的字符串。
  3. 粘贴 Notepad Text 并将 data:text/javascript;base64,String 更改为您复制的字符串。

答案 10 :(得分:0)

我几年前使用的方法-

我们需要一个jsp文件,一个servlet java文件和一个filter java文件。

将jsp文件授予用户访问权限。 jsp文件的用户类型网址。

案例1 -

  • Jsp文件会将用户重定向到Servlet。
  • Servlet将执行xxxxx.js文件中嵌入的核心脚本部分 和
  • 使用Printwriter,它将响应呈现给用户。

  • 同时,Servlet将创建一个密钥文件。

  • 当servlet尝试在其中执行xxxx.js文件时,请过滤
    将激活并检测到密钥文件存在,因此删除密钥
    文件。

一个周期结束了。

简而言之,密钥文件将由服务器创建,并由filter立即删除。

每次点击都会发生这种情况。

案例2-

  • 如果用户尝试获取页面源并直接单击xxxxxxx.js文件,则Filter会检测到该密钥文件不存在。
  • 这意味着请求不是来自任何servlet。因此,它将阻塞请求链。

可以使用会话变量中的设置值代替文件创建。

答案 11 :(得分:-1)

将您的JavaScript放入单独的.js文件中,并使用捆绑和缩小功能混淆代码。

http://www.sitepoint.com/bundling-asp-net/