JS基础与Chrome介绍

导言

在Web开发中后端负责程序架构数据管理,前端负责页面展示用户交互;在这种前后端分离的开发方式中,以接口为标准来进行联调整合,为了保证接口在调用时数据的安全性,也为了防止请求参数被篡改,大多数接口都进行了请求签名、身份认证、动态Cookie等机制。另外部分网站会对返回的数据进行加密,通常利用AES、RSA等加密方式,也有在传输时对数据进行序列化,比如Protobuf等。

参数的生成方法都是由Js来控制的,如果要想直接从接口上获取数据,就要去调试分析JavaScript的调用逻辑、堆栈调用关系来弄清楚网站加密的实现方法,根据网站的参数生成规则还原加密参数,可以称这个过程为Js逆向。

目前加密参数常用的逆向方式:

  • 根据源码的生成逻辑还原加密代码
  • copy源码补环境模拟加密参数生成
  • 通过RPC的方式远程调用

一,JavaScript基础

标识符与运算符:

语句标识符:
Throw  抛出异常
const  声明固定值的变量
let    声明块作用域的变量
var    声明变量
this   当前所属对象逻辑运算符:
&&     and
||     or
!      not位运算符:
&       如果两位都为1,则设置每位为1
|       如果两位之一为1,则设置每位为1
~        反转所有位
^         异或运算
<<<       零填充左位移
>>>       零填充右位移
>>        有符号右位移

三元运算:

v1 = 条件 ?A :B;res = 1 === 1 ? 99 : 88;
console.log(res);  // 99  先执行1 === 1

赋值和比较:

v1 = 11 === (n=123)console.log(n);  // 123
console.log(v1); // false

逻辑运算:

v1 = true || true
v2 = 9 || 14             # v2=9
v3 = 0 || 15             # v3=15
v4 = 0 || 15 || "武沛齐"  # v4=15最终结果取决那个值,结果就是那个值

举例:

var res = (null === (n = window.byted_acrawler) || void 0 === n || null === (a = n.sign) || void 0 === a ? void 0 : a.call(n, o)) || ""o = {"url":"...."}
n = window.byted_acrawler             -> 确定不为空
a = window.byted_acrawler.sign        -> 确定不为空
window.byted_acrawler.sign.call(n, i) -> 确定不为空var res = window.byted_acrawler.sign.call(n, o)

函数中的this:

function sign(v1){// this 默认内部会有个this值console.log(v1);
}
// 执行,如果没有为this赋值,函数内部默认 this=window
sign(456)// call的方式执行,函数内部 this=123
sign.call(123,456)// 若函数内部没有使用this,那sign(456)和sign.call(123,456)这两种写法没有差别
// 举例
var o = window.byted_acrawler.sign.call(n,i)
var o = window.byted_acrawler.sign(i)// n就会传递给sign函数中this
// i当做参数传递

arguments接收函数的参数:

function sign(){console.log(arguments)
}sign()
sign(11,22,33)
sign(11,22,44,55)// [Arguments] {}
// [Arguments] { '0': 11, '1': 22, '2': 33 }
// [Arguments] { '0': 11, '1': 22, '2': 44, '3': 55 }

添加键值对:

v1 = { k1:123 }
v2 = { k2:99, k3:888}Object.assign(v1, v2) // 将v2的键值对添加到v1中console.log(v1) // {k1: 123, k2:99, k3:888 }
console.log(v2) // { k2: 99, k3: 888 }

属性从一个或多个源对象复制到目标对象,返回修改后的对象

可以运用到补充环境:

extra = { k2:99, k3:888}
Object.assign(global, extra) 如果global指全局变量,那么可以直接使用如下写法:
console.log(k2)
console.log(k3)

作用域:

作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。

Js的作用域分为三种:全局作用域、函数作用域、块级作用域。

全局作用域可以让用户在任何位置进行调用,最外层函数和在最外层函数外面定义的变量拥有全局作用域,所有未定义直接赋值的变量会自动声明为拥有全局作用域(如 kfk = “kte”),所有window对象的属性也拥有全局作用域。

函数作用域只有在函数内部可以被访问。

块级作用域则是在if和switch的条件语句或for和while的循环语句中。

return 返回多个值:

在这里插入图片描述

此时实际返回的是最后一个的值,前面的都是在做运算。

在JS中有多种取值方法:

在这里插入图片描述

JSONP:

JSONP的由来:

1、Ajax直接请求普通文件存在跨域无权限访问的问题,不管是静态页面、动态页面、web服务,只要是跨域请求,一律不准。

2、不过我们发现,web页面调用js文件则不受跨域的影响(不仅如此,我们还发现凡是拥有“src”这个属性的标签都拥有跨域的能力,比如<\script>、<\img>。

3、于是可以判断,当前阶段如果想通过纯web端跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理。

4、恰巧我们知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据。

5、这样,解决方案就呼之欲出了,web服务端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件,显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装进去。

6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来很像ajax,但其实并不一样。

7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,简称JSONP。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名包裹在JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。示例:https://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403。

总结:jsonp,为了解决浏览器同源策略引发的跨域问题。格式:名字 ( {“code”:0,“message”:“0”,“ttl”:1} )

如果向某个站发送请求,获取到JSONP格式的数据,怎么处理?

- 切片+序列化
- replace
- eval内置函数对数据进行编译(当成代码来编译)
def funcname(info): # 定义对JSONP的处理函数print(type(info), info)v1 = 'funcname( {"code":0,"message":"0","ttl":1} )'
eval(v1)

二,Window对象属性

Window对象表示浏览器当前打开的窗口,有以下常用属性:

document   history  location   navigator   screen

Document,载入浏览器的HTML文档。

cookie   当前cookie
domain    文档域名
referrer   访问来源
title     文档标题
URL     当前URL

Navigator对象包含的属性描述了当前使用的浏览器,可以使用这些属性进行平台专用的配置。

userAgent   用户代理
webdriver   是否启用驱动
AppName    浏览器名称

Location对象包含有关当前URL的信息。

host    当前主机名和端口号
href     当前URL
protocol   当前URL的协议

Screen对象中存放着有关显示浏览器屏幕的信息。

height    显示屏高度
width     显示屏宽度

History对象包含用户在浏览器窗口中访问过的URL。

length    浏览器历史列表中的URL数量
back()    加载前一个URL
go()      加载某个具体页面

三,chrome开发者工具介绍

如何调出浏览器开发者工具:

  • F12(Fn+F12)
  • 右键检查
  • 右上角->更多工具->开发者工具

下面介绍chrome开发者工具最常用的5个功能模块:

Elements

元素,是经过了浏览器和JS渲染后的代码,与页面源代码不一样

用于查看或修改HTML元素的属性,CSS属性,监听事件,断点等。CSS可以即时修改,即时显示,大大方便了开发者调试页面,可以右击鼠标,对Elements中的属性进行操作

查看元素的CSS属性:在元素的右边栏中的styles页面可以查看该元素的CSS属性,这个页面展示该元素原始定义的CSS属性以及从父级继承的CSS属性。从这个页面还可以查到该元素的某个CSS特性来自那个CSS文件,使编码调试时修改代码变得十分方便

在Styles页旁边,有一个Computed页面,这个页面展示该元素经过计算之后的所有CSS属性,即最后浏览器渲染页面时使用的属性,属性的计算由浏览器自动进行,是浏览器渲染页面的一个必不可少的过程

Event Listeners 中显示了选择节点当前绑定的事件:

在这里插入图片描述

Console

控制台,一般用于执行一次性代码,查看JavaScript对象,查看调试日志信息或异常信息。还可以当作JavaScript API查看用,例如想查看console都有那些方法和属性,可以直接输入"console"并执行

Sources

源代码:该页面可以查看页面的HTML源代码,JavaScript源代码,CSS源代码,此外最重要的是可以调试JavaScript源代码,可以给JS代码添加断点等;按列分为三列,从左至右分别是文件列表区、当前文件区、断点调试区

文件列表区中有Page、Snippets、FileSytem等。Page可以看到当前所在的文件位置,在Snippets中单击New Snippets可以添加自定义的Js代码,FileSytem可以把本地的文件系统导入到chrome中

Call Stack:断点的调用堆栈列表,完整地显示了导致代码被暂停的执行路径

Scope:当前断点所在函数执行的作用域内容

Network

网络:就是爬虫中的抓包工具,主要用于查看header等与网络连接相关的信息

过滤按钮负责打开或关闭过滤面板,其中Filter框中是对url进行搜索,XHR:ajax数据,即异步加载数据

🔍按钮:其实就是ctrl+F调出的全局搜索按钮,相比Filter框搜索,🔍搜索得更细

Preserve log:保留日志,当选择保留日志,重新加载url界面时,之前请求显示的资源信息,会保留下来

Disable cache:禁用缓存,当关闭这个开关,则页面资源会存入缓存,以后再有请求时,如果缓存中已有,则不会再向浏览器发送请求

Application

Application是应用管理部分,主要记录网站加载的所有资源信息,包括储存数据(Local Storage, Session Storage, Cookies等)、缓存数据、字体、图片、样式、脚本等。

有时调试需要清除Cookies,可以在Application的Cookies位置单击鼠标右键,选择Clear进行清除,或者根据Cookies中指定的Name和Value进行清除。

注意:在辨别cookie来源时,可以看到httpOnly一栏,有√的是来自服务端,没有√的则是本地生成的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 “androidx.databinding.DataBindingUtil“ 细节和使用

介绍 数据绑定&#xff08;Data Binding&#xff09;是 Android 中的一个强大功能&#xff0c;它允许你使用声明性格式而不是编程方式将布局中的 UI 组件绑定到应用中的数据源。androidx.databinding.DataBindingUtil 类是一个工具类&#xff0c;它提供了用于处理数据绑定的方…

容器技术-docker5

一、docker-compose 常用命令和指令 1. 概要 默认的模板文件是 docker-compose.yml&#xff0c;其中定义的每个服务可以通过 image 指令指定镜像或 build 指令&#xff08;需要 Dockerfile&#xff09;来自动构建。 注意如果使用 build 指令&#xff0c;在 Dockerfile 中设置…

【面试干货】Static关键字的用法详解

【面试干货】Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;static是一个关键字&#xff0c;它可…

MT19937 64bit 机器上的实现及原理解析

1&#xff0c; mt19937 实现源码 mt19937-64bit_ex.cpp /*References:T. Nishimura, Tables of 64-bit Mersenne TwistersACM Transactions on Modeling and Computer Simulation 10. (2000) 348--357.M. Matsumoto and T. Nishimura,Mersenne Twister: a 623-dimensionally e…

水果商城外卖微信小程序模板

手机微信水果外卖&#xff0c;水果电商&#xff0c;水果商城网页小程序模板。包含&#xff1a;主页、列表页、详情页、购物车、个人中心。 水果商城外卖小程序模板

[C++][设计模式][迭代器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件构建过程中&#xff0c;集合对象内部结构常常变化各异。但对于这些集合对象&#xff0c;我们希望不暴露其内部结构的同时&#xff0c;可以让外部客户代码透明地访问其中包含的元素&#xff1b; 同时这种”透明遍历“也…

可燃气体报警器检测机构:严格遵守的安全标准

随着工业、商业和家庭领域对安全要求的不断提高&#xff0c;可燃气体报警器作为预防火灾和爆炸事故的重要设备&#xff0c;其性能稳定性和可靠性越来越受到关注。 可燃气体报警器检测机构应运而生&#xff0c;为确保这些设备的有效运行发挥着不可替代的作用。 接下来&#xf…

超强风冷制动电阻器-大功率对流冷却电阻器

风冷制动电阻 EAK 的风冷制动电阻器的制造功率范围为 5 kW 至 1200 kW。这些电阻器用于从螺旋桨、起重机、绞盘、顶部驱动器等倾倒多余的电力。 风冷电阻器是独立的单元&#xff0c;不需要进一步安装。该装置由内置风扇冷却。它也可以在没有风扇的情况下制作&#xff08;非强…

HTMLCSS(入门)

HTML <html> <head><title>第一个页面</title></head><body>键盘敲烂&#xff0c;工资过万</body> </html> <!DOCTYPE>文档类型声明&#xff0c;告诉浏览器使用哪种HTML版本显示网页 <!DOCTYPE html>当前页面采取…

D - Intersecting Intervals(abc355)

题意&#xff1a;有n个区间&#xff0c;找出俩俩区间相交的个数 分析&#xff1a; 设初始俩俩相交&#xff0c;找出不相交的&#xff08;不同区间l>r)&#xff0c;减去即可 #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ ios:…

【前端CSS3】一篇搞懂各类常用选择器(黑马程序员)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;2.1 基础选择器2.1.1 标签选择器2.1.2 类选择器2.1.3 id选择器2.1.4 通配符选择题2.1.5 类选择器与id选择器区别☀️☀️☀️2.1.6 基础选择器总结&#x1f680; 2.2 复合类选择器2.2.1 后代选择…

Linux系统编程:信号

目录 1.信号概念 2.信号产生 2.1 终端 2.2 系统调用 2.3 硬件异常 2.4 软件条件 2.5 小结 3. 进程退出时的核心转储问题 4. 信号捕捉初识 5. 阻塞信号 5.1 相关概念 5.2 在内核中的表示 6. 信号捕捉 6.1 知识铺垫 6.2 信号捕捉流程 6.3 sigset_t 6.4 信号集操…

CTFHUB-SSRF-上传文件

通过file协议访问flag.php文件内容 ?urlfile:///var/www/html/flag.php 右键查看页面源代码&#xff0c;发现需要从内部上传一个文件这样才能正常获取到flag ?urlhttp://127.0.0.1/flag.php 发现无提交按钮&#xff0c;构造一个 <input type"submit" name&qu…

RabbitMQ 之 延迟队列

目录 ​编辑一、延迟队列概念 二、延迟队列使用场景 三、整合 SpringBoot 1、创建项目 2、添加依赖 3、修改配置文件 4、添加 Swagger 配置类 四、队列 TTL 1、代码架构图 2、配置文件代码类 3、生产者 4、消费者 5、结果展示 五、延时队列优化 1、代码架构图 …

Python番外篇之责任转移:有关于虚拟机编程语言的往事

编程之痛 如果&#xff0c;你像笔者一样&#xff0c;有过学习或者使用汇编语言与C、C等语言的经历&#xff0c;一定对下面所说的痛苦感同身受。 汇编语言 将以二进制表示的一条条CPU的机器指令&#xff0c;以人类可读的方式进行表示。虽然&#xff0c;人类可读了&#xff0c…

使用deep修改前端框架中的样式

目录 1.deep的作用 2.使用方式 3.特别说明 scoped 的实现原理&#xff1a; !important 1.deep的作用 /deep/、::v-deep 和 :deep 都是用于穿透组件作用域的选择器。它们的主要目的是允许开发者在父组件中直接选择并样式化子组件内部的元素&#xff0c;即使这些元素被封装在…

JVM原理(九):JVM虚拟机工具之可视化故障处理工具

1. JHSDB:基于服务性代理的调试工具 JHSDB是一款基于服务性代理实现的进程外调试工具。 服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言实现的API集合。 2. JConsole:Java监视与管理控制台 JConsole是一款基于JMX的可视化监视、管理工具。…

千益畅行,旅游卡,如何赚钱?

​ 赚钱这件事情&#xff0c;只有自己努力执行才会有结果。生活中没有幸运二字&#xff0c;每个光鲜亮丽的背后&#xff0c;都是不为人知的付出&#xff01; #旅游卡服务#

springboot拦截器,ThreadLocal(每个线程的公共区域)

拦截器 配置信息&#xff08;拦截所有请求&#xff09; 其实这种可以作为springAOP作日志记录

SpringCloud_Eureka注册中心

概述 Eureka是SpringCloud的注册中心。 是一款基于REST的服务治理框架&#xff0c;用于实现微服务架构中的服务发现和负载均衡。 在Eureka体系中&#xff0c;有两种角色: 服务提供者和服务消费者。 服务提供者将自己注册到Eureka服务器&#xff0c;服务消费者从Eureka服务器中…