前端网络防御攻略
CSRF
CSRF:Cross Site Request Forgery,跨站请求伪造 本质是:恶意网站把正常用户作为媒介,通过模拟正常用户的操作,攻击其登录过的站点。
它的原理如下:
- 用户访问正常站点,登录后,获取到了正常站点的令牌,以cookie的形式保存。
- 用户访问恶意站点,恶意站点通过某种形式去请求了正常站点(请求伪造),迫使正常用户把令牌传递到正常站点,完成攻击。
防御
现在很多浏览器都支持禁止跨域附带的cookie,只需要把cookie设置的SameSite设置为Strict即可
SameSite有以下取值:
- Strict:严格,所有跨站请求都不附带cookie,有时会导致用户体验不好
- Lax:宽松,所有跨站的超链接、GET请求的表单、预加载连接时会发送cookie,其他情况不发送
- None:无限制
这种方法非常简单,极其有效,但前提条件是:用户不能使用太旧的浏览器,页面中的二次请求都会附带referer或Origin请求头,向服务器表示该请求来自于哪个源或页面,服务器可以通过这个头进行验证。但某些浏览器的referer是可以被用户禁止的,尽管这种情况极少
这种做法是要求每次请求需要在请求体或请求头中附带token,请求的时候:authorization: token
这种做法是要求每个要防止CSRF的请求都必须要附带验证码,不好的地方是容易把正常的用户逼疯。
这种做法是服务端渲染时,生成一个随机数,客户端提交时要提交这个随机数,然后服务器端进行对比,该随机数是一次性的
流程:
-
客户端请求服务器,请求添加学生的页面,传递cookie
-
服务器
- 生成一个随机数,放到session中
- 生成页面时,表单中加入一个隐藏的表单域
<input type="hidden" name="hash" value="<%=session['key'] %>">
-
填写好信息后,提交表单,会自动提交隐藏的随机数
-
服务器
- 先拿到cookie,判断是否登录过
- 对比提交过来的随机数和之前的随机数是否一致
- 清除掉session中的随机数
二次验证
当做出敏感操作时,进行二次验证
XSS
XSS:Cross Site Scripting 跨站脚本攻击
存储型XSS
- 恶意用户提交了恶意内容到服务器
- 服务器没有识别,保存了恶意内容到数据库
- 正常用户访问服务器
- 服务器在不知情的情况下,给予了之前的恶意内容,让正常用户遭到攻击
反射型
- 恶意用户分享了一个正常网站的链接,链接中带有恶意内容
- 正常用户点击了该链接
- 服务器在不知情的情况,把链接的恶意内容读取了出来,放进了页面中,让正常用户遭到攻击
DOM型
- 恶意用户通过任何方式,向服务器中注入了一些dom元素,从而影响了服务器的dom结构
- 普通用户访问时,运行的是服务器的正常js代码
防御
非持久型
- Web 页面渲染的所有内容或者渲染的数据都必须来自于服务端。
- 不要从 URL,document.referrer,document.forms 等这种 DOM API 中获取数据直接渲染
- 不要使用 eval, document.write(),document.writeln()等可执行字符串的方法。
- 过滤不必要的HTML标签,例如:iframe alt script和特殊字符。过滤一些事件onClcik onfocus。
- 对涉及 DOM 渲染的方法传入的字符串参数做 escape 转义
持久型
- CSP
CSP 本质上就是建立白名单。设置 HTTP Header 中的 Content-Security-Policy
- default-src : 定义针对所有类型(js/image/css/font/ajax/iframe/多媒体等)资源的默认加载策略,如果某类型资源没有单独定义策略,就使用默认的。
- script-src : 定义针对 JavaScript 的加载策略。
- style-src : 定义针对样式的加载策略。
- img-src : 定义针对图片的加载策略。
- font-src : 定义针对字体的加载策略。
-
转义字符 (可以采用htmlencode)
-
设置白名单或者黑名单
显示富文本建议采用白名单过滤,因为黑名单需要过滤的标签太多
- HttpOnly
禁止通过document.cookie的方式获取cookies