浏览器安全问题

2020-03-06  本文已影响0人  愤怒的老照

同源策略

同源即 同协议,端口,域名

同源策略的限制

如果没有同源策略,若非同源下的cookie等隐私数据可以被随意获取,非同源下的DOM可以的随意操作,ajax可以任意请求的话,用户的各种隐私势必泄露。

参考自:https://blog.csdn.net/hcrw01/article/details/84289109

XSS

浏览器颁布了同源策略后,之前获取cookie等方法就不适用了,但是也不代表就安全了。XSS就可以造成系统的不安全。
XSS,站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

XSS分类

<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>XSS</title> 
</head> 
<body> 
<form action="" method="get"> 
<input type="text" name="input">     
<input type="submit"> 
</form> 
<br> 
<?php 
$XssReflex = $_GET['input'];
echo 'output:<br>'.$XssReflex;
?> 
</body> 
</html> 

比如在输入框中输入

<script>alert(document.cookie)</script>

就会弹出当前系统的cookie,当然弹窗是没有用的,需要将信息发送到攻击者的服务器。


2.png

可以在进行数据转义,使脚本失效

&lt;script&gt;alert(document.cookie)&lt;/script&gt;

可以使用HttpOnly属性,使js不能获取cookie。
也可以使用CSP对页面进行限制,这样就不需要逐个转义,有关文章参看http://www.ruanyifeng.com/blog/2016/09/csp.html

CSRF

与XSS不同的是,CSRF并不是想办法获取cookie,而是诱导用户点击某个连接,这样访问这个网站的时候就会自动带上cookie,比如在攻击者的网站带一个链接

恭喜你获得了iPhone X一台,快来 <a href="www.icbc.com.cn/transfer?toBankId=黑客账户&money=金额">领取吧!</a>

得事先知道icbc.com.cn的转账操作的url和参数名称。如果这个用户恰好登录了icbc.com, 那他的cookie还在, 当他禁不住诱惑,点了这个链接后,一个转账操作就神不知鬼不觉的发生了。

跨域

浏览器的同源策略在一定程度上保证了安全性,同时也引来了跨域等问题,常见的跨域解决方法为反向代理,cors等,反向代理容易理解,就是代理服务器将请求作为发送方发送,cors则比较复杂一些

cors

使用过cors的人应该发现过一个http请求有时会请求2次的时候,其中一次是以options方式发起的请求,为什么会多出一次请求。
跨域问题中,有一些 request 会收不到 response,因为 response 被浏览器拦截了,内容不告诉你
另外一些请求会根本发不出去,因为浏览器不允许发出那样的 request。
接下来,我们就来讨论,哪些情况会导致收不到 response,哪些情况会导致 request 失败。这两种失败方式是由两种发送方式决定的,也就是简单请求和预检请求。

简单请求

一旦一个 request 是 simple request,那么,尽管这个请求是跨域的,它也会被浏览器直接放行。但是,在 response 返回的时候,浏览器并不会把 response 直接交给你,而是去检查这个 response 的 headers 中有没有 Access-Control-Allow-Origin,以及这个 header 的 value 包含 request 发出的地址。

如果两个条件都满足, response 会被返回给发出请求的程序;如果没有这个 header 或者 value 不对, response 就会被拦截下来,因为在浏览器看来,这个 response 不属于你(因为服务器没有明确允许你这个“域”来请求它)。如果你使用的是 chrome 浏览器,在 response 被拦截下来的时候,console 中会显示一个类似于下面的错误信息:

repeat this in your console

尽管发出request的程序无法得到 response,但是这个请求实际上是被发出了的,而且服务器也会完整的处理这个request。可以想见,如果被请求的服务器支持被跨域请求,那么它一定会想办法在 response 中加上Access-Controll-Allow-Origin这个 header,并且附上合适的值。什么是合适的值呢?在 Request 的headers中会有一个 Origin,只要Access-Controll-Allow-Origin包含这个 Origin 就可以了(如果是*,那么就等于包含所有的 Origin)。

预检请求


预检请求整个流程如下:

"预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

除了Origin字段,"预检"请求的头信息包括两个特殊字段。

(1)Access-Control-Request-Method

该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT。

(2)Access-Control-Request-Headers

该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段,上例是X-Custom-Header。

预检请求响应头:
(1)Access-Control-Allow-Methods

该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。

(2)Access-Control-Allow-Headers

如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。

(3)Access-Control-Allow-Credentials

该字段与简单请求时的含义相同。

(4)Access-Control-Max-Age

该字段可选,用来指定本次预检请求的有效期,单位为秒。上面结果中,有效期是20天(1728000秒),即允许缓存该条回应1728000秒(即20天),在此期间,不用发出另一条预检请求。

上一篇 下一篇

猜你喜欢

热点阅读