HTTP 跨域名请求(CORS)

news2025/1/23 5:56:14

同源策略


出于安全考虑,浏览器会限制脚本中发起的跨域请求。比如,使用 XMLHttpRequest 对象和Fetch发起 HTTP 请求就必须遵守同源策略。

具体而言,Web 应用程序通过 XMLHttpRequest 对象或Fetch能且只能向同域名的资源发起 HTTP 请求,而不能向任何其它域名发起请求。

 

CORS(Cross-Origin Resource Sharing)


隶属于 W3C 的 Web 应用工作组( Web Applications Working Group )推荐了一种新的机制,即跨源资源共享(Cross-Origin Resource Sharing (CORS))。这种机制让Web应用服务器能支持跨站访问控制,从而使得安全地进行跨站数据传输成为可能。

1.简单请求
  • 只使用 GET,HEAD 或者 POST请求方法。如果使用 POST 向服务器端传送数据,则数据类型(Content-Type)只能是 application/x-www-form-urlencoded, multipart/form-data 或 text/plain中的一种。
  • 不会使用自定义请求头(类似于 X-Modified 这种)。

Note: 这些跨站请求与以往浏览器发出的跨站请求并无异同。并且,如果服务器不给出适当的响应头,则不会有任何数据返回给请求方。

如果服务器端仅允许来自 http://foo.example 的跨站请求,它可以返回: Access-Control-Allow-Origin: http://foo.example 

2.预请求(Preflighted requests)

“预请求”要求必须先发送一个 OPTIONS 请求给目的站点*,来查明这个跨站请求对于目的站点是不是安全可接受的。这样做,是因为跨站请求可能会对目的站点的数据造成破坏。 当请求具备以下条件,就会被当成预请求处理:

  • 请求以 GET, HEAD 或者 POST 以外的方法发起请求。或者,使用 POST,但请求数据为 application/x-www-form-urlencoded, multipart/form-data 或者 text/plain 以外的数据类型。比如说,用 POST 发送数据类型为 application/xml 或者 text/xml 的 XML 数据的请求。
  • 使用自定义请求头(比如添加诸如 X-PINGOTHER)
3.附带凭证信息的请求(support cookies)

如果request请求要支持HTTP Cookies和验证信息,那么,XMLHttpRequest需要将withCredentials属性设置为true而response需要返回Access-Control-Allow-Credentials: true

前端代码:

// JS
var invocation = new XMLHttpRequest();
var url = 'http://bar.other/resources/credentialed-content/';

function callOtherDomain(){
  if(invocation) {
    invocation.open('GET', url, true);
    invocation.withCredentials = true;   // 设置
    invocation.onreadystatechange = handler;
    invocation.send(); 
  }

// JQuery
 $.ajax({
   ...
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
 });

4.HTTP 响应头
(1)Access-Control-Allow-Origin
Access-Control-Allow-Origin: <origin> | *

origin参数指定一个允许向该服务器提交请求的URI。对于一个不带有credentials的请求,可以指定为'*',表示允许来自所有域的请求。

还可以指定具体的域,比如:

Access-Control-Allow-Origin: http://mozilla.com

如果服务器端指定了域名,而不是'*',那么响应头的Vary值里必须包含Origin.它告诉客户端: 响应是根据请求头里的Origin的值来返回不同的内容的。

 

 

什么是跨域请求


概述

​在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址,而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。

HTML中a/form/img/css/script/iframe/ajax都可以指向资源
发起请求的资源所在域不同于该请求所指向资源所在的域的HTTP请求就叫做跨域HTTP请求 

​举个例子:假如一个域名为aaa.cn的网站,它发起一个资源路径为aaa.cn/books/getBookInfo的 Ajax 请求,那么这个请求是同域的,因为资源路径的协议、域名以及端口号与当前域一致(例子中协议名默认为http,端口号默认为80)。但是,如果发起一个资源路径为bbb.com/pay/purchase的 Ajax 请求,那么这个请求就是跨域请求,因为域不一致,与此同时由于安全问题,这种请求会受到同源策略限制。

跨源 HTTP 请求的一个例子:运行在 https://domain-a.com 的 JavaScript 代码使用 XMLHttpRequest 来发起一个到 https://domain-b.com/data.json 的请求。

出于安全性,浏览器限制脚本内发起的跨源 HTTP 请求。例如,XMLHttpRequest 和 Fetch API 遵循同源策略。这意味着使用这些 API 的 Web 应用程序只能从加载应用程序的同一个域请求 HTTP 资源,除非响应报文包含了正确 CORS 响应头。

何为不同域

协议+域名+端口号都相同才是同域

CORS 机制允许 Web 应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch)使用 CORS,以降低跨源 HTTP 请求所带来的风险。 

跨域请求的安全问题

​通常,浏览器会对上面提到的跨域请求作出限制。浏览器之所以要对跨域请求作出限制,是出于安全方面的考虑,因为跨域请求有可能被不法分子利用来发动 CSRF攻击。

如果对跨域请求不做限制,会有安全隐患
例1:一个恶意网站的页面通过iframe嵌入了支付宝的登录页面(两者不同域),如果没有任何限制,恶意网页上的javascript脚本就可以在用户登录银行的时候获取用户名和密码

例2:跨域请求别人的AJAX登录接口,也可以获取到用户名密码 

CSRF攻击:

​ CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。

​ CSRF 攻击的原理大致描述如下:有两个网站,其中A网站是真实受信任的网站,而B网站是危险网站。在用户登陆了受信任的A网站是,本地会存储A网站相关的Cookie,并且浏览器也维护这一个Session会话。这时,如果用户在没有登出A网站的情况下访问危险网站B,那么危险网站B就可以模拟发出一个对A网站的请求(跨域请求)对A网站进行操作,而在A网站的角度来看是并不知道请求是由B网站发出来的(Session和Cookie均为A网站的),这时便成功发动一次CSRF 攻击。

​ 因而 CSRF 攻击可以简单理解为:攻击者盗用了你的身份,以你的名义发送而已请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

​ 因此,大多数浏览器都会跨域请求作出限制,这是从浏览器层面上的对 CSRF 攻击的一种防御,但是需要注意的是在复杂的网络环境中借助浏览器来防御 CSRF 攻击并不足够,还需要从服务端或者客户端方面入手防御。详细可以参考这篇文章浅谈CSRF攻击方式


 

如何限制跨域请求


  1. 不允许跨域请求
    NO
  2. 服务端
    可以根据相关的HEADER判断来源,限制访问
    但是HEADER可以伪造
  3. 浏览器
    发起跨域请求时,进行限制
    同源策略 
同源策略

是浏览器的一种约定和安全功能,对跨域请求进行控制
1:限制来自不同源的document或脚本,对当前document读取或设置某些属性
2:禁止ajax直接发起跨域HTTP请求(其实可以发送请求,结果被浏览器拦截,不展示)
3:允许img/css/script(拥有src的标签都有跨域的能力。加载下来就属于当前域了)
4:允许跨域的连接、跳转、表单提交(带来了跨站请求伪造CSRF问题) 

同源策略的作用

解决了例1里面的问题:
恶意网站的JS无法读取iframe里面的内容
因为iframe加载之后属于单独的一个window当然也是一个单独的document

解决了例2里面的问题:
发起的AJAX请求结果如何被浏览器屏蔽了,虽然实际请求已经发送到服务端,但是不知道结果(所以服务端也要有相应的策略) 

示例:

server {
            #listen       443 ssl;
            listen       16443 ;
            server_name zjapp6-test.hrfax.cn;

          if ($request_method ~* PUT|DELETE) {
                return 403;
            }
           
            location ~*\.(jsp|php) {
                deny all;
                return 404;
            }

            location / {
        if ($request_method = 'OPTIONS') {
            # 处理预检请求
            #add_header 'Access-Control-Allow-Origin' 'https://bocsign-h5-test12.hrfax.cn, http://192.168.12.112:83';
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Access-Control-Allow-Headers' '*';
            add_header 'Content-Length' 0;
            return 204;
        }
                #ua_log4j
                if ($http_user_agent ~ "jndi|ldap|\$"){
                    return 403;
                }

                include proxy.conf;
                proxy_pass http://192.168.12.112:9087;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
           }

    }

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

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

相关文章

python通过csv库处理CSV文件

CSV库还有其他处理CSV的方法&#xff0c;这里只是介绍几个常用的&#xff0c;后面如果用到别的会进行更新 目录 1 生成一个新的csv文件&#xff0c;并向其中写一点东西 2 单纯往里面写几行 3 读取csv文件 1 生成一个新的csv文件&#xff0c;并向其中写一点东西 import…

工作中Git管理项目和常见问题处理

工作中Git管理项目和常见问题处理 Git仓库的管理方式为什么会出现无法push到线上处理方法 Git仓库的管理方式 共用统一仓库,不同开发人员使用不同分支 步骤 下载代码 git clone <url>查看分支 git branch创建并切换分支 git checkout -b dev分支名称保持和远程分支一…

crypto:Rabbit

题目 根据题目下载压缩包后解压&#xff0c;可得到文本提示 知识盲区&#xff0c;去了解一下Rabbit加密的密文特征 AES、DES、RC4、Rabbit、Triple DES&#xff08;3DES&#xff09; 这些算法都可以引入密钥&#xff0c;密文特征与Base64类似&#xff0c;明显区别是秘文里​​…

使用U3D、pico开发VR(一)——将unity的场景在设备中呈现

最近srtp项目在赶进度&#xff0c;自己之前是在电脑端进行的开发。但是项目是VR端&#xff0c;因此需要重新学习&#xff0c;在此记录一下自己的学习经历。 首先&#xff0c;如何将unity的场景在自己的眼镜中进行呈现呢&#xff1f; 对此&#xff0c;我也找了很多教程&#xff…

关于redis的一主三从三哨兵的实现

关于redis的一主三从三哨兵的实现 前言docker相关的docker-compose.ymlsentinel.conf重点解释一下上面的语句 前言 当谈到数据库管理系统时&#xff0c;Redis就像是那个充满魔法的巫师&#xff0c;能够让你的应用程序变得更快、更可靠&#xff0c;就像是施了魔法一样。而今天&…

HONEYWELL 05704-A-0145

HONEYWELL 05704-A-0145电源模块通常用于为其他设备或系统提供电力供应&#xff0c;以确保它们正常运行。HONEYWELL 05704-A-0145电源模块的应用领域可以非常广泛&#xff0c;包括但不限于以下几个领域&#xff1a; 工业自动化&#xff1a;HONEYWELL 05704-A-0145电源模块用于工…

NEON优化:性能优化经验总结

NEON优化&#xff1a;性能优化经验总结 1. 什么是 NEONArm Adv SIMD 历史 2. 寄存器3. NEON 命名方式4. 优化技巧 Reference: NEON优化&#xff1a;性能优化经验总结NEON官方内联函数Arm NEON programming quick referenceLearn the architecture - Neon programmers’ guide …

Windows server 2022(2023年9月 映像更新 - 20348.1970)安装测试

本文记录了Windows server 2022(2023年9月 映像更新 - 20348.1970)的安装测试过程。 一、检查ISO 简体中文 - Windows Server 2022&#xff08;2023年9月更新 - 20348.1970&#xff09; 内含版本&#xff08;Windows Server 2022 Standard、Windows Server 2022 Standard (D…

期权定价模型系列【6】:欧式期权、百慕大期权、美式期权的定价模型与对比【蒙特卡洛模拟、二叉树模型】

期权定价模型系列第6篇文章 1. 前言 对于欧式期权&#xff0c;最常用的是BS模型&#xff0c;此外&#xff0c;也可也用蒙特卡洛模拟方法求解欧式期权的价格。当然&#xff0c;对于美式期权&#xff0c;也同样可以用蒙特卡洛模拟方法来求解&#xff0c;一般对美式更多用的是二叉…

Kubernetes(K8s):未来云原生应用的引擎

文章目录 Kubernetes的核心概念和架构为什么K8s是构建云原生应用的首选工具&#xff1f;云原生应用的好处和挑战容器编排的重要性&#xff1a;Docker和KubernetesKubernetes生态系统&#xff1a;核心组件和附加工具实际应用&#xff1a;企业如何在生产环境中使用K8s未来展望&am…

基于大语言模型扬长避短架构服务

秘诀&#xff1a; 扬泛化之长&#xff0c; 避时延之短

Linux socket 字节序

socket介绍 字节序 验证什么字节序 #include<stdio.h> int main() {union {short value;char btypes[sizeof(short)];} test;test.value 0x0102;if(test.btypes[0] 1 && test.btypes[1] 2) {printf("大端字节序\n");}else{printf("小端字节序…

postman的使用

感觉自己对于postman 的使用其实还是入门级别的 因为新公司的都是微服务调用所以需要使用本地postman进行调用。 接口大概是这个样子&#xff0c;截图的最下面就是接口的具体情况了 首先看PostMapping判断是否是get或者post 然后RequestHeader参数就是为了在postman中添加head…

安卓玩机-----教你修改微信的启动图 让心中的“她“成为微信沟通的第一屏【仅供参考】

微信已经成为我们生活中必不可少的安装必装软件之一。但单调的启动第一屏让人感到乏味。那么今天只给大家做个教程演示是怎么修改这个启动第一屏、其实任何的app都可以进行修改图标 启动界面等等的操作。需要替换的图片可以任意选择&#xff0c;我前面很多博文介绍过apk的反编译…

Mac 电脑查看本地maven,及私有仓库的搭建与使用【nexus的配置与使用】

查看本地maven 查看状态如果要查看本地maven&#xff0c;使用命令行&#xff1a; mvn help:effective-settings 如下如localRepository标签 nexus下载 官网地址 解压后如下图 启动服务器/停止服务器 bin 目录下 执行命令&#xff1a; ./nexus start 如下图表面启动成功…

java常用API(Math,System,Runtime)

Math Math的常用方法 package myMath;public class myMath {public static void main(String[] args) {System.out.println(Math.abs(-99));//这个表示取绝对值的 打印结果为99//但是他有个bug.int最大取值范围是-2,147,483,648 到2,147,483,647System.out.println(Math.abs(-…

经典垃圾回收器

Serial收集器 Serial 是一种新生代的收集器。顾名思义“serial 串行”&#xff0c;它是一种单线程工作的收集器&#xff0c;它的“单线程”并不仅仅指的只有一个处理器或一个线程来实现垃圾的收集工作&#xff0c;更重要的是他在垃圾收集的过程中会暂停所有的用户线程&#xf…

算法通过村第九关-二分(中序遍历)黄金笔记|手撕二分

文章目录 前言1. 基本查找2. 二分查找与分治2.1 循环的方式2.2 递归的方式 3. 元素中的重复的二分查找总结 前言 提示&#xff1a;有些人&#xff0c;远看是灯塔&#xff0c;靠近是悬崖。 --任明信《别人》 二分查找是非常重要的算法之一&#xff0c;不仅要掌握&#xff0c;更要…

印章篆刻小程序商城的作用是什么

印章的需求度也有很高市场需求&#xff0c;处理办公印章外&#xff0c;还有艺术类的&#xff0c;而对爱好者来说&#xff0c;需要找到一家靠谱的品牌制作&#xff0c;包括材料、样式、内容等都有较高要求&#xff0c;线上可以接触到更多雕刻商家。 而对品牌来说&#xff0c;需…

常见应用层协议

一.HTTP&#xff08;超文本传输协议&#xff09; HTTP 和 HTTPS 二.FTP&#xff08;文件传输协议&#xff09; 三.SMTP&#xff08;简单邮件传输协议&#xff09; 四.POP3&#xff08;邮局协议版本3&#xff09; 五.IMAP&#xff08;互联网消息访问协议&#xff09; 六.DNS&am…