前端安全防范

338 阅读4分钟

安全扫描工具

  • Arachni
  • Mozilla HTTP Observatory
  • w3af

XSS(cross-site scripting 跨站脚本攻击)

定义:攻击者通过注入非法的 html 标签或者 javascript 代码,当用户浏览该网页时,控制用户浏览器。

分类:持久型和非持久型

  • 持久型就是攻击的代码被服务端写入进数据库中

  • 非持久型,通过修改URL参数的方式加入攻击代码,诱导用户访问链接从而进行攻击。

防御策略:

  • 转义字符:转义输入输出的内容,对于引号、尖括号、斜杠进行转义
  • 过滤:过滤标签和标签属性(onclick等事件、style、script节点、iframe节点)
  • CSP建立白名单,明确告诉浏览器那些外部资源可以加载和执行。

通常可以通过两种方式来开启 CSP:

第一种:设置HTTP Header中的Content-Security-Policy

第二种:设置meta标签方式

<meta http-equiv="Content-Security-Policy">

这里以设置 HTTP Header 来举例 :

只允许加载本站资源 Content-Security-Policy:default-src 'self'

CSRF(Cross Site Request Forgery 跨站请求伪造)

原理:攻击者构造出一个后端请求地址,诱导用户点击或者通过某些途径自动发起请求。如果用户在登录状态下的话,后端就以为是用户在操作,从而进行相应的逻辑。

CSRF通常是从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强本身的网站针对CSRF的防护能力提升安全性。

CSRF的两个特点:

  • CSERF通常发生在第三方域名
  • CSRF攻击者不能获取到Cookie信息,只是使用

防御:

  • 阻止不明外域的访问
    • 同源检测
    • Samesite Cookie
  • 提交时要求附加本域才能获取的信息
    • CSRF Token
    • 双重Cookie验证 在HTTP协议中,每一个异步请求都会携带两个Header,用于标记来源域名:
  • Origin Header
  • Referer Header

防御策略:

  • Get 请求不对数据进行修改

  • 不让第三方网站访问到用户Cookie

  • 阻止第三方网站请求接口

  • 请求时附带验证信息,比如验证码Token

    • 服务器发送给客户端一个token
    • 客户端提交的表单中带着这个token
    • 如果这个 token 不合法,那么服务器拒绝这个请求。
  • SameSite

对Cookie设置SameSite属性。该属性表示Cookie不随着跨域请求发送,可以很大程度减少CSRF的攻击,该属性并不是所有的浏览器都兼容

点击劫持

定义:点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过iframe嵌套的方式潜入自己的网页中,并将iframe设置为透明,在页面中透出一个按钮诱导用户点击。

防御策略:

  • X-FRAME_OPTIONS 是一个HTTP响应头,该响应头有三个值可选

(1)DENY,表示页面不允许通过iframe 的方式展示

(2)SAMEORIGIN,表示页面可以在相同域名下通过iframe的方式展示

(3)ALLOW_FORM,表示页面可以在指定来源的iframe中展示

  • JS防御
<head>
<style id="click-jack">
html{
    display:none !important
}

</style>
</head>
<body>
<script>
if(self == top){
    var style = document.getElementById('click-jack')
    document.body.removeChild(style)
}else {
    top.location = self.location
}
</script>
</body>

中间人攻击

中间人攻击是攻击方同时与服务端和客户端建立起了连接,并让对方认为连接是安全的,但是实际上整个通信过程都被攻击者控制了。攻击者不仅能获得双方的通信信息,还能修改通信信息。

解决方案:

HTTPS 就可以用来防御中间人攻击,但是并不是说使用了 HTTPS 就可以高枕无忧了,因为如果你没有完全关闭 HTTP 访问的话,攻击方可以通过某些方式将 HTTPS 降级为 HTTP 从而实现中间人攻击。

XSS 与 CSRF 的区别???

区别一:

XSS:不需要登录。
CSRF:需要用户先登录网站A,获取 cookie。

区别二:

XSS:是向网站 A 注入 JS代码,然后执行 JS 里的代码,篡改网站A的内容。
CSRF:是利用网站A本身的漏洞,去请求网站A的api。