昨晚面试第一个问题就被问到了项目中登录界面的XSS和CSRF攻击,与以往面试不同,感觉这次更偏重于实战,今天研究一下这方面的内容,面经是不敢写了,我怕再收到律师函(狗头保命)
- 含义:XSS即跨站脚本(Cross Site Scripting)曾经简称CSS,但是为了和层叠样式表(Cascading Style Sheets),也就是前端三大元素之一的CSS区别,因此被称为XSS。具体描述见XSS概述
- 原理:总所周知,HTML是一种超文本标记语言,作为前端语言的“骨”,通过将一些字符特殊地对待来区别文本和标记,最常见的就是<,例如 "< div >< p >(PS:差点忘了markdown格式会把这类标签视为语法格式)那么攻击者通过某种手段将<等特殊符号插入,那么浏览器将会视为一段HTML标签,并将其运行,如果这段代码内含有JavaScript代码,那么该脚本同样会被浏览器执行。
- 分类:主要分为三大类
- 反射性XSS,前台发出请求时,XSS代码出现在URL中,作为输入提交到后台,后台解析后响应,XSS代码随响应内容一起传回给前台浏览器,最后浏览器解析执行XSS代码。
- 存储型XSS,存储型XSS和反射型XSS的差别不大,区别在于存储型XSS并不会直接执行,提交的代码会存储在数据库等后台进行缓存,下次请求目标页面时不用再提交XSS代码,直接从后台调用。记得有一次长发现我们网站的一个BUG,提交一段代码
<script>alert('Hello,World!');</script>
作为代码评测网站,可以查看提交内容,当查看时,就会出现弹窗,因为进行查看申请后,系统会从数据库查询内容出来并显示,浏览器发现有XSS代码,浏览器由于未识别特殊字符,就当做正常的HTML与Js解析执行,于是触发了XSS攻击,修复方式为HTML转义。
- DOM XSS,与前两者不同,DOM XSS不需要后台服务端的参与,只与前台浏览器有关,触发XSS靠的是浏览器端的DOM解析。该类攻击造成的后果与DOM操作有关,可以输出某个节点的内容,修改DOM树,甚至增加删除DOM节点。
- 防御:
- 输入过滤输出转义:输入过滤就是对提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容,比如对参数中所有“javascript”这个关键字进行检索,但是这种鉴别不够灵活,凡是提交的信息中各有“javascript”时,就被硬性的被判定为XSS攻击然。输出转义既为对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。
- 在HTTP头部配上,set-cookie:
httponly-这个属性可以防止XSS,它会禁止javascript脚本来访问cookie。
secure - 这个属性告诉浏览器仅在请求为https的时候发送cookie。