网站首页 > 技术文章 正文
你可以在小编主页中看到其他文章
为啥你一定要会而且搞清楚跨域?
用不用的到先不说,有另外2个重要原因:
面试必考
超级多的网站并没有防跨域攻击 ,嘿嘿...
跨域这两个字,跨是个动词,那么‘域’到底是什么鬼?
域是什么?
简单的说就是网址,域指的是协议+主机+端口组成的网址,比如 https://www.toutiao.com
同源策略对域的限制
同源策略是浏览器对不同域之间访问资源的限制:
1. 不同域之间不可以发送 HTTP 请求
2. 浏览器不同窗口的 DOM BOM 对象是独立的,无法访问
3. iframe标签嵌套的页面也遵守同源策略
跨域攻击指的是第一种情况。
如果浏览器没有这些限制会怎么样?
比如黑别人的扣扣,我完全可以在自己的网站引用扣扣官网的html,js等模拟官网,欺骗别人登陆,然后记录输入的账号密码等。
跨域的几种实现方式
这里只介绍几种常用的
JSONP
jsonp是为了解决跨域请求的DIY出来的方法,而且也比较方便,大部分的跨域问题都使用此种方式解决
** 原理 **
同源策略中,src属性的请求不会被限制跨域,那么可以利用这点完成跨域请求,但需要和后端配合
** 实现 **
步骤:
1. src指定接口,返回的代码会被视为js代码执行
<script src="https:www.bbb.com/test.php?callback=myCallback"></script>
2. 写个全局函数
var myCallback = function(data) {
console.log(data);
};
注:一般是全局的,指定对象下的方法也可,但需要和后端协商好
3. 后端返回拼接后的js代码
<?php
$callback=$_GET['callback'];
$data='sfsdfsdfas';
echo $callback.'("'.$data.'")';
>
//返回给前端并被作为js执行,调用相应的函数,获得传回来的数据
callback("sfsdfsdfas")
使用jQ更简单些:
不需要回调函数写在success里即可,这样可以不配置全局函数(jsonpCallback),jQ自动生成完成后自动销毁
$.ajax({
url:"https:www.bbb.com/test.php",
dataType:"jsonp",
type:"get",
// jsonp:"callback",
// jsonpCallback:"jsonpcallback",
success:function(data){
console.log(data);
},
error:function(data){
onsole.log(data);
}
})
** 缺点 **
只能是get请求(src发送的都是get)
postMessage+iframe
如果你只是想调用另一个网站的页面,直接用iframe即可。如果想获取它的数据可以使用H5的 postMessage
window.postMessage(data,域)传递信息可以跨域
域为 * 时,不限制。
步骤:
1. 使用iframe引入另一个网站
<iframe id="hisPage" src="https://www.bbb.com/test.html" onLoad="onLoad()"></iframe>
<script>
function onLoad(){
var hisPage = document. getElementById ( 'hisPage' );
var hisWindow = hisPage. contentWindow;
hisWindow. postMessage ( 'asfdsfds',* );
}
</script>
2. 另一个网站使用onmessage事件监听数据
window.onmessage=function(e){
e= e|| event;
console.log(e.data);//值在data属性里
}
缺点:限于H5,不适合用于直接请求接口,但可以变通,也需要相互配和
代理
此方式由后端完成,后端访问没有浏览器的同源策略限制,也就不存在跨域问题。
后端一般也有限制,比如没登陆则无权请求接口等。
比如你想访问 https:www.bbb.com/test.php ,通过代理解决步骤如下:
1. 前端请求后端的某个接口(即代理)
2. 这个接口模拟请求(包含合法的用户信息)去访问 https:www.bbb.com/test.php
3. 获得返回数据后再传给前端
跨域资源共享(CORS)
目标域的后端可以通过修改header,来允许所有来源的访问,或指定访问源
在php接口脚本中加入以下两句即可:
//允许所有来源访问
header('Access-Control-Allow-Origin:*');
//允许访问的方式
header('Access-Control-Allow-Method:POST,GET');
前端也要修改
$.ajax({
url:"https:www.bbb.com/test.php",
xhrFields: {
// 前端设置是否带cookie
withCredentials: true
},
//会让请求头中包含跨域的额外信息,但不会含cookie
crossDomain: true,
success:function(){...}
});
跨域到这里搞清楚了,下篇文章搞事情——CSRF 跨域攻击
【javascript】【javascript】【javascript】【javascript】【javascript】【javascript】
猜你喜欢
- 2024-10-12 渗透测试XSS跨站攻击检测手法 xss跨站攻击类型
- 2024-10-12 e起学丨WEB安全渗透测试基础知识(六)
- 2024-10-12 全面整合才是王道,美军挑战打造全领域联合指管系统
- 2024-10-12 想送林动避雷针是什么梗 出自武动乾坤之英雄出少年
- 2024-10-12 文件上传漏洞是什么?这么通俗易懂的讲解真的很难得!
- 2024-10-12 Web渗透测试攻防之浅述信息收集 app渗透信息收集
- 2024-10-12 交易所安全测试(十一)丨安全审计指南
- 2024-10-12 Mutual Mean-Teaching:为无监督学习提供更鲁棒的伪标签
- 2024-10-12 配置跨域后,框架帮我们做了什么?
- 2024-10-12 前后端分离后,Java Web开发如何解决跨域问题?
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)