前言
1.考虑数据安全是每个程序员开发时应有的意识。
在安全意识较薄弱的公司,不考虑数据安全,大多数情况下也能完成任务,而且开发效率更高,一般也不会出问题。但是作为一个准优秀程序员,开发时最好还是考虑一下数据安全。
2.很难保证绝对的数据安全。
当获取数据的成本大于数据本身的价值时,获取数据就没有意义了。
同样的,当维护数据的成本大于数据本身的价值时,维护也意义不大了。
以下是本人在项目(BS架构)中实际使用的一些数据安全措施,文章持续更新~
发送手机验证码时机
登录场景,输入手机后,发送验证码,然后输入验证码,登录
方案1
发送验证码时,校验手机号是否库内手机号,是的话才发送验证码,否则提示“用户未注册”
方案2
发送验证码时,不校验手机号是否库内,登录时先校验手机号是否库内,再校验验证码是否正确
方案1有安全漏洞,黑客可以扫描发送验证码接口,判断哪些手机号是库内,然后再暴力尝试验证码
如何防止敏感地址被随意访问
对于一些敏感地址,需要用户使用账号密码登陆后,才允许访问。(甚至是双因子登录,即密码+手机验证码)
如何实现未登录或登录过期状态下,访问敏感地址后,跳转到登录页面,登录成功后跳转回敏感地址。
解决方案步骤如下:
1.访问敏感地址时,后端如果判断为未登录状态,在登录地址后拼接上?redirectUrl=敏感地址,如aaa.com?redirectUrl=bbb,然后重定向到拼接后的登录地址
2.前端登录成功后,用正则提取出敏感地址,然后跳转到该地址
如何防止系统敏感文件被随意下载、传播
很多系统有下载文件的功能,如果文件被下载,就可能被随意传播。
解决方案步骤如下:
1.后端使用jacob等组件把文件转换为pdf格式。
2.前端使用pdf.js在线预览pdf文件,仅提供预览按钮,不提供下载按钮。
3.pdf.js支持对文件加水印,可以从后端返回当前登录人身份信息,把信息作为水印打到文件上。
注意事项:
1.默认情况下,pdf.js允许打印和下载,需要禁用这两个功能。(如何禁用问度娘)
2.对比过OpenOffice、POI等若干组件,jacob的转换效果最佳,不足之处是需要部署在window系统,不支持linux系统,且转换成功率不是100%
如何防止敏感文件下载接口被随意访问
解决方案:
在cookie或header中携带token,利用token做权限校验。
本方案不足之处是,如果通过抓包等方式,拿到token,就可以模拟请求下载文件。
优化后的方案步骤如下:
1.依旧使用token做为第一步校验
2.在文件信息表,增加auth字段并初始化为一串随机字符串
3.修改下载文件接口:
新增auth字段作为参数,即文件下载接口url包含auth字段;
每次访问该接口,先比较auth参数与db里的auth字段是否一致,并更新db的auth字段;
如果auth比较结果为一致,才允许下载文件
4.每次调用下载文件接口前,从db查询auth,把auth拼接到下载文件url上,这样即可保证每一个url只能访问一次(即同一个文件,每次访问都需要用不同的url),因为同样的auth只能使用一次,再次使用时与db里的不一致了
如何防止系统上敏感图片的地址被随意访问
正常情况下,浏览器右键复制图片地址后,该地址可以被随意访问。
对于接口的校验,我们一般是在请求头加上有一定有效期的token作为校验依据。
但是前端<img src='xxx'></img>这样的形式,无法携带请求头。
解法方案:
发起对图片的HTTP请求时,默认会携带同域或子域的cookie,可以利用该特性,把token放在cookie中,对cookie中的token做校验。
![](https://img.haomeiwen.com/i20803889/02a0c070f77e1c6d.png)
然而,在一些特殊场景下,无法对图片做校验,例如使用javamail发送邮件(javamail+freemarker发送HTML格式邮件),且邮件中包含图片(同样是<img src='xxx'></img>这样的形式),如果邮件收件人接收到邮件时,处于未登录状态,图片就无法正常显示,可是如果不对图片做校验,图片地址就可以被随意访问。
解决方案:
将图片转换为BASE64编码,再嵌入到邮件中即可,邮件内容极难被解析。
使用referer请求头做防盗链
当浏览器向服务器发送请求时,一般会带上referer请求头,告诉服务器请求是从哪里链接过来的。
该请求头常用于防盗链,即设置一个ip/域名白名单,通过referer获取发起请求的ip/域名,当ip/域名在白名单内才允许访问资源。
接口入参不要有规律
例如,与外部系统对接时,不要提供download?fileId=xx这样的接口,否则对方知道fileId(或者暴力尝试),就可以获取到其他文件,尤其是fileId有规律时(比如自增主键);
把对方所需范围内的文件,放到sftp服务器,通过sftp方式提供文件,就可以增加安全性。
不要在cookie/session storage/local storage放可以控制权限的字段
例如下图中,session storage中的isAdmin用于控制用户是否管理员,前端根据isAdmin控制按钮的隐藏/显示
![](https://img.haomeiwen.com/i20803889/dab8df6199908ec7.png)
需求:把系统的一部分文件提供给其他系统
方案1:通过接口传输,假如对方伪造入参,就可能获取到本无权获取的文件
方案2:把对方有权访问的文件,同步到单独一台服务器A,对方通过sftp获取A上的文件,以物理方式保证安全性
使用cookie的path属性和httpOnly属性,提高安全性
网友评论