[TOC]
漏洞场景
输入错误的用户名,会有明确的提示——帐号不存在。
攻击者可以通过此方法枚举找出存在的帐号,存在安全漏洞
整改建议:帐号密码校验时,无论账号还是账号密码错误统一给以模糊的提示如:"帐号或密码错误"即可。
如: 直接获取到前端的静态资源文件中有的关键信息
漏洞描述: 永远不要相信用户输入的信息,如常规的注入脚本通过input输入之后被页面执行
整改办法
方法1:对于vue项目中ElementUI的el-input 和 原生input
<el-input :placeholder="privateSearchPlaceholder" v-model.trim="privateValue" @keyup.enter.native="querySearchStr" clearable maxlength="100" @clear="clearSearchStr"></el-input>
watch: {/** * 监听文本框值变化 * */privateValue (val) {// 此处不加nextTick,显示的还会使原来的带有特殊字符的字符串;但是实际的值已经改变this.$nextTick(() => {// 去除特殊字符(除去数字字母中文之外都是特殊字符)this.privateValue = val.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]+/g, '') // this.privateValue =this.$myTools.stringFilter(val) // 也可全局注册过滤函数})}
}
方法2:针对ElementUI的el-input
<el-input @input="onInput" v-model.trim="searchStr"></el-input>
methods:{onInput(val){console.log(val)this.searchStr = e.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]+/g, '')}
}
注意:前端禁止了特殊字符,但是抓包工具直接请求还是可以发送特殊字符,所以建议后端关键接口也要对特殊字符做处理,SQL注入也可用类似方法解决部分(当然如果已经做了防重放的话也可以理论上避免抓包重发)。
漏洞描述:涉及到用户密码的系统,需要限制用户对账号密码的复杂度做要求,不可允许使用弱密码
整改建议:配置安全合理的密码策略,如必须为包含数字、字母、特殊字符,且长度不可短于8位,下面是对复杂度做验证的函数
密码长度8~30位,且必须包含字母、数字、特殊字符的vue表单校验
let pwd = '';
var pwdValidate = function(rule, value, callback){pwd = valueif(!value){return callback(new Error('密码不可为空'))}else{// 正则表达式校验密码if (value.length > 8 && value.length < 30 && value.replace(/[a-zA-Z0-9]/g, '').length > 0) {if (_userAccount && (value.includes(_userAccount) || value == _userAccount)) {return callback(new Error('密码中不允许出现用户名或与用户名相同'))}callback()}else {return callback(new Error('密码长度8~30位,且必须包含字母、数字、特殊字符'));}}
}
漏洞描述:用户登录帐号与密码、用户姓名、身份证、电话等关键信息不可明文传输
整改方式:采用加密处理,切记不可只采用单层md5加密,虽然md5不可解密,但是现在采用字典暴力破解的可能性也越来越大
(1)可以在加密时加入salt,减小被碰撞破解的可能;或者采用对称或者非对称加密;
(2)对称加密加密与解密使用的是同样的密钥,速度快,但由于需要将密钥在网络传输,所以安全性不高。
(3) 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。
(4) 适当的解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
现象描述: 在信息安全测试的项中,竟然要求禁止除GET和POST之外的HTTP方法,开始不是很理解,查询之后说法如下:
一、HTTP请求方法有哪些
HTTP1.0定义了三种请求方法: GET、POST、HEAD
HTTP1.1新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE 、CONNECT