网络安全策略
报名入口来源:中国教育在线 2022-06-01
项目中的网络安全策略取舍与总结
一、前言
web服务中,用户输入用户名密码登入之后,后续访问网站的其他功能就不用再输入用户名和密码了。因此,身份验证引起的网络安全在所有企业级项目中都是个必须去探讨的话题,并一定针对不同的安全隐患设置相应的防范策略。
下面分享几个我从项目中总结提炼出来的一些网络安全经验。
首先我们先来巩固一下两种常用的身份验证机制:
二、两种身份验证机制
1. cookie-session机制
传统的身份校验机制为cookie-session机制:
用户浏览器访问web网站,输入用户名密码
服务器校验用户名密码通过之后,生成sessonid并把sessionid和用户信息映射起来保存在服务器
服务器将生成的sessionid返回给用户浏览器,浏览器将sessionid存入cookie
此后用户对该网站发起的其他请求都将带上cookie中保存的sessionid
服务端把用户传过来的sessionid和保存在服务器的sessionid做对比,如果服务器中有该sessionid则代表身份验证成功
这种方式存在以下几个问题:
代码安全机制不完善,可能存在CSRF漏洞
服务端需要保存sessionid与客户端传来的sessionid做对比,当服务器为集群多机的情况下,需要复制sessionid,在多台集群机器之间共享
如果需要单点登入,则须将sessionid存入redis等外部存储保证每台机器每个系统都能访问到,如果外部存储服务宕机,则单点登入失效
2. JWT认证方式
JWT全称 Json Web Token,是一个长字符串,由三部分组成:Header(头部)、 Payload(负载)、Signature(签名),Header.Payload.Signature,用.分割各部分内容。
验证过程如下:
用户访问网站,输入账号密码登入
服务器校验通过,生成JWT,不保存JWT,直接返回给客户端
客户端将JWT存入cookie或者localStorage
此后用户发起的请求,都将使用js从cookie或者localStorage读取JWT放在http请求的header中,发给服务端
服务端获取header中的JWT,用base64URL算法解码各部分内容,并在服务端用同样的秘钥和算法生成signature,与传过来的signature对比,验证JWT是否合法
再来了解一下两种常用的攻击手段:
三、两种常见网络攻击手段
1. XSS攻击
解释:跨站脚本攻击。其基本原理同sql注入攻击类似。
举例:通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等
2. csrf攻击
解释:伪装来自受信任用户的请求来利用受信任的网站。
举例:跟XSS攻击差不多,主要区别在于 XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。若用户先打开了某资金转账网站,生成了cookie存储在浏览器,又被吸引打开了钓鱼网站,钓鱼网站就会获取到用户的cookie,可以自动向已登录的通过信任的资金转账网站的接口去发起请求转移资金。Csrf能做的事情包括利用你的身份发邮件、发短信、进行交易转账等等,甚至盗取你的账号。
想要攻击成功,这三步缺一不可。
第一,登录受害者网站。如果受害者网站是基于 cookie 的用户验证机制,那么当用户登录成功后,浏览器就会保存一份服务端的 SESSIONID。
第二,这时候在同一个浏览器打开攻击者网站,虽然说它无法获取 SESSIONID 是什么(因为设置了 http only 的 cookie 是无法被 JavaScript 获取的),但是从浏览器向受害者网站发出的任何请求中,都会携带它的 cookie,无论是从哪个网站发出。
第三,利用这个原理,在攻击者网站发出一个请求,命令受害者网站进行一些敏感操作。由于此时发出的请求是处于 session 中的,所以只要该用户有权限,那么任何请求都会被执行。
四、两者在实际应用场景的取舍
我们的项目最开始选择的是JWT认证方式。
因为,使用JWT验证,由于服务端不保存用户信息,不用做sessonid复制,这样集群水平扩展就变得容易了。同时用户发请求给服务端时,前端使用JS将JWT放在header中手动发送给服务端,服务端验证header中的JWT字段,而非cookie信息,这样就避免了CSRF漏洞攻击。
但是,由于服务端发出去的令牌我们存储在浏览器的localstorage中,所以令牌是可以通过xss攻击获取的。并且一旦令牌发出,令牌的过期时间就无法修改,所以一旦令牌被xss攻击劫持将会发生安全问题。
然而cookie-session机制设置http-only可以很好的预防xss攻击,并且针对CSRF攻击可以采用验证码确认,来对一些重要操作进行安全防范。所以最后我们又选择回归用cookie-session机制来进行身份校验。
注:为了避免xss攻击,客户端和服务端都应该对提交数据进行xss攻击转义。