2025年8月

步骤:1)拷贝以下代码,保存为html文件;

2)解密:双击运行html文件,将"eval(function(p,a,c,k,e,d){...}))"代码拷贝至页面文本框中,点击“解密”,即完成解密过程;

3)加密:双击运行html文件,将需要加密的JS脚本文件内容拷贝至页面文本框中,点击“加密”,即完成加密过程;

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
        <title>
            JavaScript加解密实用工具
        </title>
        <script>
            a = 62;
            function encode() {
                var code = document.getElementById('code').value;
                code = code.replace(/[\r\n]+/g, '');
                code = code.replace(/'/g, "\\'");
                var tmp = code.match(/\b(\w+)\b/g);
                tmp.sort();
                var dict = [];
                var i, t = '';
                for (var i = 0; i < tmp.length; i++) {
                    if (tmp[i] != t) dict.push(t = tmp[i]);
                }
                var len = dict.length;
                var ch;
                for (i = 0; i < len; i++) {
                    ch = num(i);
                    code = code.replace(new RegExp('\\b' + dict[i] + '\\b', 'g'), ch);
                    if (ch == dict[i]) dict[i] = '';
                }
                document.getElementById('code').value = "eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}(" + "'" + code + "'," + a + "," + len + ",'" + dict.join('|') + "'.split('|'),0,{}))";
            }

            function num(c) {
                return (c < a ? '': num(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36));
            }

            function run() {
                eval(document.getElementById('code').value);
            }

            function clearAll() {
                document.getElementById('code').value = '';
            }

            function decode() {
                var code = document.getElementById('code').value;
                code = code.replace(/^eval/, '');
                document.getElementById('code').value = eval(code);
            }
        </script>        
    </head>
    
    <body>        
        <textarea id='code' cols=80 rows=20></textarea>
        <br>
        <input type=button onclick=decode() value=解密>
        <input type=button onclick=encode() value=加密>
        <input type=button onclick=run() value=执行>
        <input type="button" onclick="clearAll()" value="清空">       
    </body>

</html>

拦截HTTP请求是什么?

HTTP,全称是Hyper Text Transfer Protocol,就是超文本传输协议。在Web应用中,客户端与服务器之间的通信都是基于HTTP协议的。在HTTP请求中,我们可以通过拦截HTTP请求,在请求到达服务器之前对请求进行修改或者拦截。这样我们可以在请求发送到服务器之前修改或者添加HTTP请求头,或者查看请求参数和请求结果等等。

为什么要拦截HTTP请求?

拦截HTTP请求可以让我们更好地掌握网络应用程序的整体运行流程和状态。我们可以了解到所有请求的实时状态并实时记录,及时发现问题并进行处理。

在开发过程中,我们可以根据实际需要,通过拦截HTTP请求来修改、添加或删除请求头,从而实现特定的功能。比如,我们可以在请求头中添加一些验证信息,或者在前端请求到后端数据时,可以在请求中添加固定的参数,控制请求流程等等。

如何拦截HTTP请求?

浏览器提供了一些 API 可以用来拦截 HTTP 请求,比如XMLHttpRequest和fetch。下面我们一一了解一下:

1.XMLHttpRequest拦截请求
在原生JavaScript中,我们可以使用XMLHttpRequest来发起请求。其中代表 HTTP 请求的 readyState 属性有 5 种状态。

我们可以针对 readyState 状态来监听和拦截 HTTP 请求。

let xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
  if(xhr.readyState === 4) {  // see the below 5 states
    console.log( xhr.responseText );
  }
};

xhr.open("GET", "/test", true);

xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");

xhr.send();

在上述代码中,我们先创建一个XMLHttpRequest对象xhr,然后去监听 xhr 的状态。当 readyState 为4时,表示请求已经响应完毕。

2.fetch拦截请求
fetch 也是一个用于网络请求的API,它提供了更加简单和方便的请求方式。

fetch('/test')
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(myJson);
  });

在fetch中,我们可以使用 then() 函数来对响应做出反应。这里,第一个函数返回一个响应对象 response,然后我们将 response 解析成 JSON,放在myJson中。

我们还可以针对 fetch 的请求进行拦截和修改,以此实现特定的功能。

总结

拦截HTTP请求可以让我们实时监测和记录所有请求的状态,及时发现并处理问题。同时,我们也可以通过拦截HTTP请求,对请求头进行修改,实现特定的功能。在Web应用中,拦截HTTP请求是不可或缺的,而JavaScript又是实现拦截HTTP请求的一种常用方式,可以帮助我们更好地掌握Web应用程序的整体运行状态,并实现特定的功能。

域名信息
先简单介绍一下域名:往往使用简单易记的名称,去标识互联网中网站或服务的地址。也就是说域名信息,实际就是目标企业在互联网中所提供服务的地址信息。
那我们该怎样去收集目标的域名信息呢?

1.官方备案查询平台:https://beian.miit.gov.cn/#/Integrated/recordQuery
2.浏览器语法查询
若使用Google浏览器,则可通过浏览器语法对子域进行查询。
以百度为例,Google搜索:site:baidu.com ,其含义为搜索baidu.com的相关地址。
3.DNS查询
借助在线平台,通过其平台数据库存储的主域历史dns解析记录,去获取主域下的更多子域信息。
在线DNS查询平台:https://dnsdumpster.com/
4.子域名枚举
通过字典进行子域构造,再通过DNS服务器对这些子域进行查询,从而获取能够被解析的子域。

Q:我们可以看到,无论是在线平台还是本地工具,都能获取到很多子域,那这些子域都是有效信息吗?
A:当然不是,这往往是由于DNS泛解析配置引起的,泛解析会使某一主域下所有未明确指定的子域(无论其子域是否存在)都指向同一ip。因此获取到这些能被DNS解析的子域后,还需借助工具依次对这些域名进行访问,进一步筛选出有价值的域名。
5.证书查询
当域名在使用Https协议时,需要配置证书,而同一主域下所使用的证书往往相同。因此可通过查询主域证书信息来获取更多的子域信息。
在线证书查询平台:https://crt.sh/,案例同上

什么是MPIC?

MPIC是一种新的行业标准,要求使用DNS(如DigiCert)的证书颁发机构(CA)开始检查多个网络位置的域控制和CAA记录详细信息,称为远程视角.这种冗余为BGP劫持或DNS操纵等安全威胁提供了更强的保护,这些威胁可能使攻击者获得他们不控制的域的证书。MPIC要求在签发证书之前有足够的远程视角同意。

其他概念

  1. HTTPS证书
    HTTPS证书(通常称为SSL/TLS证书)是用来在服务器和客户端之间建立安全的加密连接的证书。

它是由受信任的证书颁发机构(Certificate Authority,简称CA)颁发的数字证书。

HTTPS证书包含信息,如域名、证书持有者信息、公钥、有效期等,用于证明服务器的身份。

  1. CA证书
    CA证书是由证书颁发机构自己签署的根证书,用于验证其他证书(例如HTTPS证书)的真实性。

每个受信任的CA都有自己的根证书,通常预装在操作系统或浏览器中。

客户端在访问HTTPS网站时,会通过CA证书来验证HTTPS证书是否可信。

二者的关系

CA证书是信任链的基础,用来验证其他证书,包括HTTPS证书。

HTTPS证书是服务器提供的,经过CA签名后,客户端通过CA证书信任该HTTPS证书。

举例

当你访问一个HTTPS网站时,服务器会提供它的HTTPS证书。

客户端会检查这个证书是否由受信任的CA签名。如果是,那么连接是安全的;否则,浏览器会提示不可信的连接。

总结

HTTPS证书是由CA颁发的,但它本身不是CA证书。CA证书是用来验证HTTPS证书的根证书。

JavaScript 中提供了两种方式来设置定时器,分别是 setTimeout() 和 setInterval(),它们之间的区别如下:

方法 说明
setTimeout() 在指定的时间后(单位为毫秒),执行某些代码,代码只会执行一次
setInterval() 按照指定的周期(单位为毫秒)来重复执行某些代码,定时器不会自动停止,除非调用 clearInterval() 函数来手动停止或着关闭浏览器窗口

setTimeout()
JS setTimeout() 函数用来在指定时间后执行某些代码,代码仅执行一次。

JS setTimeout() 函数的语法格式如下:

setTimeout(function[, delay, arg1, arg2, ...]);
setTimeout(function[, delay]);
setTimeout(code[, delay]);

参数说明如下:
function:一个函数(通常使用匿名函数),其中定义了定时器中要执行的代码;
code:字符串类型的代码,这些代码会在定时器到期后被编译执行,出于安全考虑不建议使用;
delay:可选参数,定时器在执行的其中代码之前,要等待的时间,单位为毫秒(1秒 = 1000毫秒),如果省略此参数,则表示立即执行;
arg1、arg2、...、argN:要传递给函数的参数。

示例代码如下:

<script type="text/javascript">
        var myFun = function (str = 'JavaScript'){
            document.write(str + "<br>");
        };
        setTimeout(myFun, 500, 'Hello');
        setTimeout(myFun, 1000);
        setTimeout(function(){
            document.write("定时器<br>");
        }, 1500)
        setTimeout("document.write(\"setTimeout()\")", 2000);
    </script>

运行上面的代码,会间隔 500 毫秒,依次输出下面的内容:
Hello
JavaScript
定时器
setTimeout()

setInterval()
JS setInterval() 函数可以定义一个能够重复执行的定时器,每次执行需要等待指定的时间间隔。

JS setInterval() 函数的语法格式如下:

setInterval(function, delay, [arg1, arg2, ...]);
setInterval(code, delay);

参数说明如下:
function:一个函数(通常使用匿名函数),其中定义了定时器中要执行的代码;
code:字符串类型的代码,这些代码会在定时器到期后被编译执行,出于安全考虑不建议使用;
delay:可选参数,定时器在执行的其中代码之前,要等待的时间,单位为毫秒(1秒 = 1000毫秒),如果省略此参数,则表示立即执行;
arg1、arg2、...、argN:要传递给函数的参数。

提示:通过 setInterval() 函数定义的定时器不会自动停止,除非调用 clearInterval()
函数来手动停止或着关闭浏览器窗口。

JS 取消定时器
当使用 setTimeout() 或 setInterval() 设置定时器时,这两个方法都会产生一个定时器的唯一 ID,ID 为一个正整数值,也被称为“定时器标识符”,通过这个 ID,我们可以清除 ID 所对应的定时器。

我们可以借助 clearTimeout() 或 clearInterval() 函数来分别清除由 setTimeout() 或 setInterval() 函数创建的定时器。调用 clearTimeout() 或 clearInterval() 函数需要提供定时器的唯一 ID 作为参数,示例代码如下:

//1.设置一个定时器
const timerId: number=setTimeout(()=>{
console.log("这个消息可能永远不会被打印");
},2000);

//2.在它触发前取消它
clearTimeout(timerId);

常见痛点:
timerId 变量需要被保留在组件或模块的作用域中,状态分散。
启动、暂停、取消的逻辑是割裂的,代码可读性和可维护性差。