xss注入
XSS攻击
xss全称为
Cross Site Scripting
也就是跨站脚本攻击,为了和Css区分,所以叫XSS。
什么是XSS
XSS跨站脚本攻击,是中代码注入攻击。攻击者通过在目标网站上注入恶意脚本,是指在用户浏览器运行来窃取用户敏感信息或者利用这些信息冒充用户向网站发起攻击
XSS攻击的类型
根据攻击来源XSS攻击分为三种类型:反射型、存储型、DOM型
反射型
反射型XSS是把用户输入的数据(不可信数据)从服务器反射给用户浏览器,当用户的输入或者一些用户可控参数未经处理地输入到页面上,就容易产生XSS漏洞。
常见攻击流程
- 通过url传递参数的功能,如搜索等。攻击者构造一个带有恶意代码的url,
- 用户点击打开,网站服务端将恶意代码从url中取出,凭借在HTML中返回给浏览器,
- 用户浏览器解析后恶意代码也会执行,
- 、恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为调用目标网站接口执行操作。
存储型
存储型(或者HTML注入型/持久型)XSS攻击不需要用户点击特制链接,攻击者仅需要提交攻击代码到网站上其他用户可以访问的地方,比如评论、留言板等,当用户访问时攻击代码就自动执行
常见攻击流程
- 在评论时将xss攻击代码插入到其中,传入后端服务器,到数据库中
- 其他用户查看该评论时就会执行这段代码,从而导致xss漏洞。
DOM型
DOM型XSS是通过修改页面的DOM节点形成的。攻击者构造一个含有恶意代码的url,当用户打开时前端取出url中的恶意代码并执行,攻击者就可以窃取用户信息或者冒充用户行为。
常见攻击流程
比如页面中有一个img元素,他的图片链接取的是我们页面参数id拼接而成的。
http://localhost:5000/index?id=1
此时修改链接为
http://localhost:5000/index?id=1" onerror="alert(document.cookie)
此时页面元素为
<img src="img/1" onerror="alert(document.cookie)" />
当图片加载失败时就会执行onError方法,造成xss漏洞
防范XSS攻击
- 输入检查,对于用户的输入进行检查、转义、过滤等。建立可信任的字符和html标签白名单,对于不在白名单内的字符或者标签进行过滤或者编码
- 输入长度控制,对于不可信的输入应该限定一个合理的长度,虽然不能完全防止,但是能增加攻击的难度
- 设置HttpOnly,浏览器将禁止页面的JS访问带有HttpOnly属性的cookie,来防止恶意脚本通过document.cookie访问到用户隐私数据
- 现在主流浏览器都内置了防范XSS的措施。例如CSP
CSP配置
- 通过HTTP头部的Content-Security-Policy字段
- 通过网页meta标签
示例1
所有内容均来自站点的同一个源(不包括其子域名)
Content-Security-Policy: default-src 'self'
示例2
允许内容来自信任的域名及其子域名 (域名不必须与CSP设置所在的域名相同)
Content-Security-Policy: default-src 'self' *.trusted.com
示例3
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
上面示例3的CSP进行了如下配置
I 脚本:只信任当前域名
II
III 样式表:只信任cdn.example.org和third-party.org
IV 框架(frame):必须使用HTTPS协议加载
V 其他资源:没有限制