xss 与 csrf 攻击
xss
概念
XSS 全称是 Cross Site Scripting(即跨站脚本),为了和 CSS 区分,故叫它XSS。XSS 攻击是指浏览器中执行恶意脚
本(无论是跨域还是同域),从而拿到用户的信息并进行操作。
类型
XSS 攻击的方式一般有三种: 存储型、反射型和文档型。
存储型:
一般是将代码存储到数据库,服务器将这些数据取出返回给客户端,
客户端执行这些恶意代码,
从而达到攻击的效果。
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
反射型:
指一般恶意脚本作为网络请求的一部分。
服务器拿到q参数,然后将内容返给浏览器端,
浏览器将这些内容作为html的一部分解析,
发现是一段脚本,直接执行,然后就被攻击了
之所以叫它反射型, 是因为恶意脚本是通过作为网络请求的参数,经过服务器,然后再反射到HTML文档中,执行解析。
和存储型不一样的是,服务器并不会存储这些恶意脚本。
文档型
文档型的 XSS 攻击并不会经过服务端,而是作为中间人的角色,在数据传输过程劫持到网络数据包,然后修改里面的 html 文档!
这样的劫持方式包括WIFI路由器劫持或者本地恶意软件等。
防范措施
我们可以发现,三种XSS攻击都是让恶意脚本在浏览器中执行。
措施:
1.不相信用户的输入
无论是前端还是后端,都对用户输入的内容进行转码和过滤
如:
<script>alert('你完蛋了')</script>
转码后变为:
<script>alert('你完蛋了')</script>
这样的代码在 html 解析的过程中是无法执行的。
当然也可以利用关键词过滤的方式,将 script 标签给删除。那么现在输入的就没有内容了。
2. 利用 CSP
CSP,即浏览器中的内容安全策略,它的核心思想就是服务器决定浏览器加载哪些资源,
具体来说可以完成以下功能:
1)限制其他域下的资源加载。
2)禁止向其它域提交数据。
3)提供上报机制,能帮助我们及时发现 XSS 攻击。
3. 利用 HttpOnly
很多 XSS 攻击脚本都是用来窃取Cookie,
而设置 Cookie 的 HttpOnly 属性后,JavaScript 便无法读取 Cookie 的值。
这样也能很好的防范 XSS 攻击。
csrf 攻击
CSRF(Cross-site request forgery), 即跨站请求伪造,指的是黑客诱导用户点击链接,打开黑客的网站,然后黑客利
用用户目前的登录状态发起跨站请求。
举个例子, 你在某个论坛点击了黑客精心挑选的小姐姐图片,你点击后,进入了一个新的页面。
那么恭喜你,被攻击了:)
1. 自动发起get请求
加入黑客网站里有这样一段代码:
<img src="https://xxx.com/info?user=hhh&count=100">
进入页面后自动发送get请求, 这里请求会带上你 xxx.com 的cookie 信息,如果你登陆过的话。
如果服务端没有相应的验证机制,就会认为这是一个正常用户的请求,
因为携带了相应的cookie,就可能进行转账汇款或者其他恶意操作。
2. 黑客可能自己写了一个表单,一个自动提交的表单。
同样会携带用户的cookie ,让服务器认为是一个正常用户的操作,让其他恶意操作成为可能。
3. 诱导点击触发get请求
黑客的网站上可能会放一个诱导链接来让你点击,
<a href="https://xxx/info?user=hhh&count=100" taget="_blank">点击进入修仙世界</a>
点击后发送get请求,接下来和上面 ***自动发 GET 请求*** 同理。
防御措施
csrf 攻击中的重要一环就是发送目标站点下的cookie, 然后就是这一份cookie 模拟了用户身份,
因此在cookie上下文章是不二之选!
1. 利用Cookie的SameSite属性
SameSite可以设置为三个值,Strict、Lax和None。
a. Strict 模式下,浏览器完全禁止第三方请求携带cookie,
比如请求 karlfranz.cn 网站只能在 karlfranz.cn域名请求中携带cookie,
其他网站请求都不能。
b. Lax 模式下相对宽松一点,但只能 在get方法请求表单 或 a 发送get请求下可以 携带cookie,
其他情况均不能。
c. 在none模式下, 也就是默认模式,请求会自动携带cookie 。
2. 验证来源站点
这就需要用到请求头中的两个字段 Origin 和 Referer,
其中Origin 只包含域名信息, 而Referer 包含了具体的url路径。
不过这两者都可以伪造,通过Ajax 的自定义请求就可以伪造,安全性略差。
3. CSRF Token
Django 是一门后端框架,在它的表单 (template 中)开发表单时,
经常会附上这一段代码:
{% csrf_token %}
这就是 csrf token的典型应用,
它的原理是浏览器向服务器发送请求时,服务器生成一个字符串,将其植入返回的页面中,
然后浏览器发送和请求时,就必须带上这个字符串,来让服务器验证是否合法,
如果不合法,就不予以相应。
这个字符串就是 csrf token ,
通常第三方站点无法拿到这个token, 因此发出的请求也就被服务器拒绝。
参考资料
//juejin.cn/post/6844904021308735502?utm_source=gold_browser_extension#heading-64