【安全】RefererXMLHttpRequest部分内容

news2024/11/15 11:45:51

目录

Referer

Referrer-policy

设置referer

盗链

防盗链的工作原理

防盗链的三种方式

如何绕过图片防盗链

XMLHttpRequest

构造函数

XMLHttpRequest 的实例属性

XMLHttpRequest.readyState

XMLHttpRequest.onreadystatechange

XMLHttpRequest.response

XMLHttpRequest.responseType

XMLHttpRequest.status,XMLHttpRequest.statusText

XMLHttpRequest.responseText

XMLHttpRequest对象简单用法的完整例子

事件监听属性

方法

XMLHttpRequest.open(method,url,async,user, password)

XMLHttpRequest.send(string)

XMLHttpRequest.setRequestHeader()

XMLHttpRequest.abort()

XMLHttpRequest 实例的事件

readyStateChange 事件

progress 事件

load 事件、error 事件、abort 事件

loadend 事件

timeout 事件


Referer

Referer请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用Referer(注:`正确英语拼写应该是referrer,由于早期HTTP规范的拼写错误,为了保持向后兼容就一直延续下来`)请求头识别访问来源,可能会以此统计分析、日志记录以及缓存优化等。

Referrer-policy

Referrer-policy作用就是为了控制请求头中referer的内容

  •  no-referrer : 整个referee首部会被移除,访问来源信息不随着请求一起发送。
  •  no-referrer-when-downgrade : 在没有指定任何策略的情况下用户代理的默认行为。在同等安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送 (HTTPS->HTTP).
  • origin: 在任何情况下,仅发送文件的源作为引用地址。例如 https://example.com/page.html 会将 Example Domain 作为引用地址。
  • origin-when-cross-origin: 对于同源的请求,会发送完整的URL作为引用地址,但是对于非同源请求仅发送文件的源。
  • same-origin: 对于同源的请求会发送引用地址,但是对于非同源请求则不发送引用地址信息。
  • strict-origin: 在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS),但是在降级的情况下不会发送 (HTTPS->HTTP)。
  • strict-origin-when-cross-origin: 对于同源的请求,会发送完整的URL作为引用地址;在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP)。
  • unsafe-url: 无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。(最不安全了)

设置referer

        ①在HTML中设置meta标签

        <meta name="referrer" content="origin">

        ②用<a>、<area>、<img>、<iframe>、<script> 或者 <link> 元素上的 referrerpolicy 属性为其设置独立的请求策略

        如:

        <script src='/javascripts/test.js' referrerpolicy="no-referrer"></script>

        

        【可以理解成局部政策】

盗链

        盗链就是在自己的页面里展示别人服务器里的一些东西

        例如

        <body>

            <img src=" 网络源照片.jpg">

        </body>

        

        发现没偷到照片,这就是有防盗链的措施

防盗链的工作原理

        通过Referer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以追踪到显示它的网页地址 一旦检测到来源不是本站,即进行阻止或者返回指定的页面

防盗链的三种方式

        1. 时间戳防盗链

        在url链接中加入时间戳信息,来防止盗链。当盗链者没有及时更新url链接时,便会无法访问。这是一种常规方式,假如盗链者比较勤奋,经常更新url链接,则时间戳的方法会失效。

        2. 中心鉴权

        中心鉴权等于在源站加一层验证,对防盗链有效,但是用户请求时间会增加,影响体验,最好搭配CDN使用,先让终端用户的请求通过CDN节点,再通过鉴权服务器鉴权,降低请求时间。

        3. Referer防盗链

        Referer是http一个标记,它会告诉服务器该网页是从哪里来的,通过设置Referer黑白名单来防止被盗链。

如何绕过图片防盗链

        那么现在的很多网站是如何利用referer来进行防图片盗链的呢?

        三种情况下允许引用图片:

        1. 照片是本网站的。

        2. 请求头里没有referer信息的情况。(服务器认为是从浏览器直接访问的图片URL,所以这种情况下能正常访问)

        3. 被你要盗链的服务器授权的网址。

        因此我们只能从情况2入手,通过设置referer为空进行绕过防盗链。

具体操作需要学习JS,水平有限暂时不复现了

XMLHttpRequest

【哪里用得上?】

本来是在浏览器那输入网址然后浏览器向服务器发出http请求,后面IE更新引入新功能,可以用JS向服务器发起http请求,简单来说,页面可以自己悄悄更新数据不影响你。js向服务器发起http请求的过程也叫做AJAX(Asynchronous JavaScript and XML)(阿贾克斯)

XML格式已经过时,但这个名字沿用了下来

AJAX包括以下几个步骤

  •  创建 XMLHttpRequest 实例【这个就是下边要讲的了】
  •  发出 HTTP 请求
  •  接收服务器传回的数据
  •  更新网页数据

XMLHttpRequest(XHR)对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这⭐允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequest 在 AJAX 编程中被大量使用。

尽管名称如此,XMLHttpRequest 可以用于获取任何类型的数据,而不仅仅是 XML。它甚至支持 HTTP 以外的协议(包括 file:// 和 FTP),尽管可能受到更多出于安全等原因的限制。

构造函数

XMLHttpRequest()

该构造函数用于初始化一个 XMLHttpRequest 实例对象。在调用任何其他方法之前,必须先调用该构造函数,或通过其他方式,得到一个实例对象。

创建 XMLHttpRequest 对象的语法:

var 实例对象名字 = new XMLHttpRequest();

XMLHttpRequest 的实例属性

XMLHttpRequest.readyState

        `XMLHttpRequest.readyState`返回一个整数,表示实例对象的当前状态。该属性只读。它可能返回以下值。

        - 0,表示 XMLHttpRequest 实例已经生成,但是实例的`open()`方法还没有被调用。

        - 1,表示`open()`方法已经调用,但是实例的`send()`方法还没有调用,仍然可以使用实例的`setRequestHeader()`方法,设定 HTTP 请求的头信息。

        - 2,表示实例的`send()`方法已经调用,并且服务器返回的头信息和状态码已经收到。

        - 3,表示正在接收服务器传来的数据体(body 部分)。这时,如果实例的`responseType`属性等于`text`或者空字符串,`responseText`属性就会包含已经收到的部分信息。

        - 4,表示服务器返回的数据已经完全接收,或者本次接收已经失败。

        通信过程中,每当实例对象发生状态变化,它的`readyState`属性的值就会改变。这个值每一次变化,都会触发`readyStateChange`事件。

XMLHttpRequest.onreadystatechange

        XMLHttpRequest.onreadystatechange属性指向一个监听函数。readystatechange事件发生时(实例的`readyState`属性变化),就会执行这个属性。

        另外,如果使用实例的`abort()`方法,终止 XMLHttpRequest 请求,也会造成`readyState`属性变化,导致调用`XMLHttpRequest.onreadystatechange`属性。

XMLHttpRequest.response

        `XMLHttpRequest.response`属性表示服务器返回的数据体(即 HTTP 回应的 body 部分)。它可能是任何数据类型,比如字符串、对象、二进制对象等等,具体的类型由`XMLHttpRequest.responseType`属性决定。该属性只读

        如果本次请求没有成功或者数据不完整,该属性等于`null`。但是,如果`responseType`属性等于`text`或空字符串,在请求没有结束之前(`readyState`等于3的阶段),`response`属性包含服务器已经返回的部分数据。

XMLHttpRequest.responseType

        `XMLHttpRequest.responseType`属性是一个字符串,表示服务器返回数据的类型。这个属性是可写的,可以在调用`open()`方法之后、调用`send()`方法之前,设置这个属性的值,告诉浏览器如何解读返回的数据。如果`responseType`设为空字符串,就等同于默认值`text`。

`XMLHttpRequest.responseType`属性可以等于以下值。

  • ""(空字符串):等同于`text`,表示服务器返回文本数据。
  • "arraybuffer":ArrayBuffer 对象,表示服务器返回二进制数组。
  • "blob":Blob 对象,表示服务器返回二进制对象。
  • "document":Document 对象,表示服务器返回一个文档对象。
  • "json":JSON 对象。
  • "text":字符串。

XMLHttpRequest.status,XMLHttpRequest.statusText

        `XMLHttpRequest.status`属性返回一个整数,表示服务器回应的 HTTP 状态码。一般来说,如果通信成功的话,这个状态码是200;如果服务器没有返回状态码,那么这个属性默认是200。请求发出之前,该属性为`0`。该属性只读。

        - 200, OK,访问正常

        - 301, Moved Permanently,永久移动

        - 302, Moved temporarily,暂时移动

        - 304, Not Modified,未修改

        - 307, Temporary Redirect,暂时重定向

        - 401, Unauthorized,未授权

        - 403, Forbidden,禁止访问

        - 404, Not Found,未发现指定网址

        - 500, Internal Server Error,服务器发生错误

        基本上,只有2xx和304的状态码,表示服务器返回是正常状态。

XMLHttpRequest.responseText

        `XMLHttpRequest.responseText`属性返回从服务器接收到的字符串,该属性为只读。只有 HTTP 请求完成接收以后,该属性才会包含完整的数据。

XMLHttpRequest对象简单用法的完整例子

var xhr = new XMLHttpRequest();


xhr.onreadystatechange = function(){

  // 通信成功时,状态值为4

  if (xhr.readyState === 4){

    if (xhr.status === 200){

      console.log(xhr.responseText);

    } else {

      console.error(xhr.statusText);

    }

  }

};



xhr.onerror = function (e) {

  console.error(xhr.statusText);

};



xhr.open('GET', '/endpoint', true);

xhr.send(null);

事件监听属性

XMLHttpRequest 对象可以对以下事件指定监听函数。

- XMLHttpRequest.onloadstart:loadstart 事件(HTTP 请求发出)的监听函数

- XMLHttpRequest.onprogress:progress事件(正在发送和加载数据)的监听函数

- XMLHttpRequest.onabort:abort 事件(请求中止,比如用户调用了`abort()`方法)的监听函数

- XMLHttpRequest.onerror:error 事件(请求失败)的监听函数

- XMLHttpRequest.onload:load 事件(请求成功完成)的监听函数

- XMLHttpRequest.ontimeout:timeout 事件(用户指定的时限超过了,请求还未完成)的监听函数

- XMLHttpRequest.onloadend:loadend 事件(请求完成,不管成功或失败)的监听函数

方法

XMLHttpRequest.open(method,url,async,user, password)

        初始化一个请求。

        method:请求的类型;GET 或 POST

        url:文件在服务器上的位置

        async:true(异步)或 false(同步)

        user&password:string可选填参数

XMLHttpRequest.send(string)

        将请求发送到服务器。如果请求是异步的(默认),那么该方法将在请求发送后立即返回。

        string:仅用于 POST 请求

        如果对象open过了再open一遍等于abort(),终止请求

        GET 请求

        xmlhttp.open("GET","demo_get.asp",true);

        xmlhttp.send();

         在上面的例子中,您可能得到的是缓存的结果。

        为了避免这种情况,请向 URL 添加一个唯一的 ID:

        【后面加个随机数即可】

        xmlhttp.open("GET","demo_get.asp?t=" + Math.random(),true);

        xmlhttp.send();

         POST 请求

        xmlhttp.open("POST","demo_post.asp",true);

        xmlhttp.send();

        【注:所有 XMLHttpRequest 的监听事件,都必须在send()方法调用之前设定】

XMLHttpRequest.setRequestHeader()

        此方法用于设置浏览器发送的HTTP请求头的信息,【只能在open()send()两个方法之间调用】如果该方法多次调用,设定同一个字段,则每一次调用的值会被合并成一个单一的值发送。

        xhr.setRequestHeader('Content-Type', 'application/json');

        xhr.setRequestHeader('Content-Length',,JSON.stringify(data).length);

        xhr.send(JSON.stringify(data));

        上面代码首先设置头信息Content-Type,表示发送 JSON 格式的数据;然后设置Content-Length,表示数据长度;最后发送 JSON 数据。

XMLHttpRequest.abort()

        `XMLHttpRequest.abort()`方法用来终止已经发出的 HTTP 请求。调用这个方法以后,`readyState`属性变为`4`,`status`属性变为`0`。

 

XMLHttpRequest 实例的事件

readyStateChange 事件

        `readyState`属性的值发生改变,就会触发 readyStateChange 事件。

        我们可以通过`onReadyStateChange`属性,指定这个事件的监听函数,对不同状态进行不同处理。尤其是当状态变为`4`的时候,表示通信成功,这时回调函数就可以处理服务器传送回来的数据。

progress 事件

        上传文件时,XMLHttpRequest 实例对象本身和实例的`upload`属性,都有一个`progress`事件,会不断返回上传的进度

        

load 事件、error 事件、abort 事件

        load 事件表示服务器传来的数据接收完毕,error 事件表示请求出错,abort 事件表示请求被中断(比如用户取消请求)。

        

loadend 事件

        `abort`、`load`和`error`这三个事件,会伴随一个`loadend`事件,表示请求结束,但不知道其是否成功

        

timeout 事件

        服务器超过指定时间还没有返回结果,就会触发 timeout 事件,具体的例子参见`timeout`属性一节。

【注意,AJAX 只能向同源网址(协议、域名、端口都相同)发出 HTTP 请求,如果发出跨域请求,就会报错(详见《同源政策》和《CORS 通信》两章)。】

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

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

相关文章

如何从区块链上数据识别出套利行为或者抢跑三明治交易

如何识别链上套利行为或者抢跑夹子三明治行为或交易 识别原子 MEV交易 鉴于交易可以任意复杂并且可以有无数未知交易模式&#xff0c;使用特定交易模式匹配的方法无法应对新的 MEV 模式。为了确定交易中是否发生套利&#xff0c;我们需要对交易进行通用抽象。 以下是我们为认…

【Java寒假打卡】Java基础-集合Set

【Java寒假打卡】Java基础-集合Set概述哈希值hashSet原理HashSet存储学生对象并遍历小结概述 底层数据结构是哈希表不能保证存储和去除的顺序完全一致没有带索引的方法&#xff0c;所以不能使用普通的for循环进行遍历 使用增强for循环或者迭代器进行遍历由于是Set集合&#xf…

PC企业微信4.0 HOOK逆向

最新功能 企业微信已更新到4.0.X版本 &#xff0c;支持控制台的朋友圈、群发等操作。 功能列表: 企业微信接口文档 个人微信已更新至3.7.6.44 个微接口 ***********************分割线***************************** 请求命令码 2000 获取自己的信息 2001 获取指定好友的信息 2…

Reeds-Shepp曲线基础运动公式推导过程

本文是对之前文章“Reeds-Shepp曲线学习笔记及相关思考【点击可跳转】”的补充&#xff0c;因小伙伴的提问&#xff0c;本文补充介绍上述文章第三部分中基础运动公式的推导过程。 本文以上面的第一个公式为例进行介绍&#xff0c;即Reeds-Shepp曲线基础运动中的向前左转运动&am…

JDK 17 史诗级JVM调优

文章目录 JDK 17 之 JVM调优 史诗级 教程 1 调优层次2 调优指标3 JVM调优原则3.1 优先原则3.2 堆设置3.3 年轻代设置3.4 老年代设置3.5 方法区设置3.6 GC设置3.6.1 GC发展阶段3.6.2 G1的适用场景3.6.3 其他收集器适用场景4 JVM调优步骤4.1 监控分析4.1.1 如何生成GC日志4.1.2 …

python + pandas 如何实现web网页的断点连续采集

目录 一、实战场景 二、知识点 python 基础语法 python 文件读写 pandas 数据处理 web 连续采集 三、菜鸟实战 列表页断点连续采集基本思路 基本思路 网页列表页断点连续采集实现 Pandas 保存数据 csv 文件 详情页断点采集思路 基本思路 网页详情页断点连续采集代…

RealWorldCTF2023体验赛 部分WEB

WEB &#x1f411;了拼&#x1f411; 拼图或者直接搜索js文件代码 Evil Mysql Server Mysql恶意服务器读取文件&#xff0c;MySQL_Fake_Server或者Rogue-MySql-Server直接读文件&#xff0c;填写vps的ip端口让服务器连接。 Be-a-Language-Expert 前段时间thinkphp6 多语言…

初级软件测试面试会问什么 拿好这些问题的标准答案,offer不在话下

随着互联网的不断发展&#xff0c;企业对于IT方面的人才需求也越来越大&#xff0c;在追求人才数量的同时&#xff0c;也注重人才质量。而面试就成为把握质量的拦门砖&#xff0c;因此&#xff0c;你想要走心仪的公司&#xff0c;那么你在面试中的表现将会直接决定你求职的成败…

C++ 语法基础课7 —— 类、结构体、指针、引用

文章目录1. 类和结构体1.1 类的定义1.2 类的使用1.3 结构体1.4 构造函数2. 指针和引用2.1 指针2.2 数组2.3 引用2.4 查询地址3. 链表3.1 添加结点3.2 删除结点1. 类和结构体 1.1 类的定义 class Person {private:int age, height;double money;string books[100];public:stri…

嵌入式系统移植导学

目录 系统移植导学 系统移植过程 Windows装机 Linux系统移植 开发板启动过程 系统移植导学 操作系统&#xff1a;向下管理硬件、向上提供接口 操作系统为我们提供了&#xff1a; 1.进程管理 2.内存管理 3.网络接口 4.文件系统 5.设备管理 那系统移植是干什么呢&am…

Zabbix使用LLD自动发现规则发现监控docker容器(下)

本篇是使用Zabbix监控docker容器下篇。利用ZABBIX自动发现监控功能&#xff0c;在部署zabbix agent客户端的服务器上&#xff0c;编写自定义功能脚本&#xff0c;实现自动获取服务器上运行的docker服务并监控其运行状态。 前提条件 已经部署好的zabbix监控系统 Zabbix服务器…

自动驾驶专题介绍 ———— 惯性导航

文章目录介绍工作原理特点应用场景介绍 惯性导航系统&#xff08;Inertial Navigation System - INS&#xff09;是一种不依赖外部输入信息、也不向外辐射能量的自助式导航系统&#xff0c;是通过陀螺仪和加速度计为敏感器件的导航参数解算系统。该系统根据陀螺仪输出建立导航坐…

安全—03day

虚拟主机基于域名、端口、IP访问nginx 一、虚拟主机基于域名访问nginx 1.为虚拟主机提供域名解析 echo "192.168.181.130 www.nj.com www.benet.com" >> /etc/hosts2.为虚拟主机准备网页文档 mkdir -p /var/www/html/benet mkdir -p /var/www/html/nj echo…

linux系统中QT进行文本读写操作的方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;利用QT进行文本的读写操作方法。 目录 第一&#xff1a;文本读写基本简介 第二&#xff1a;应用实例 第三&#xff1a;运行效果 第一&#xff1a;文本读写基本简介 有时候我们需要对文件进行读写&#xff0c;比如写个Mp3…

第01讲:Docker入门

一、什么是Docker 1、Docker 是一个开源的应用容器引擎 2、诞生于 2013 年初&#xff0c;基于 Go 语言实现&#xff0c; dotCloud 公司出品&#xff08;后改名为Docker Inc&#xff09; 3、Docker 是一个可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器引擎&…

Java--集合--经典七道综合练习题

文章目录 一、集合的遍历方式 二、添加数字并遍历 三、添加学生对象并遍历 四、添加学生对象并遍历 五、添加用户对象并判断是否存在 六、添加手机对象并返回要求的数据 七、创建学生管理系统&#xff08;*****&#xff09; 一、集合的遍历方式 需求&#xff1a;定义一…

深耕5G云专网,阿里云祝顺民入选“2022年度5G创新人物”

2022 年&#xff0c;5G 商用发展成效显著&#xff0c;正在加速产业数字化&#xff0c;全面赋能经济社会发展。运营商 5G 投资超过 4000 亿元&#xff0c;共带动 8.6 万亿元的经济产出&#xff0c;而这一切离不开奋战在 ICT 行业的 5G 应用推动者。 日前&#xff0c;由中国工信…

分享104个PHP源码,总有一款适合您

PHP源码 分享104个PHP源码&#xff0c;总有一款适合您 链接&#xff1a;https://pan.baidu.com/s/1MnmNb3vsofBnQ4kKoMlSBw?pwdkl4o 提取码&#xff1a;kl4o 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载…

Python学生信息管理系统源码,学生教师端分离,支持数据的增删查改、数据分析与统计 基于Tkinter带图形界面

介绍 Python学生信息管理系统。学生教师端分离&#xff0c;支持数据的增删查改、数据分析与统计。 下载地址&#xff1a;Python学生信息管理系统源码 软件架构 Python3.9版本 Python-Tkinter库开发的图形界面 Python-Pandas库数据处理 Python-matplotlib库数据分析与展示 P…

C语言经典100例(006,007)

题目&#xff1a;用*号输出字母C的图案。 程序分析&#xff1a;可先用*号在纸上写出字母C&#xff0c;再分行输出。 程序源代码&#xff1a; #include "stdio.h" int main() {printf("用 * 号输出字母 C!\n");printf(" ****\n");printf("…