最近做完项目时,甲方对系统有要过安全等保三级的要求,这里针对我所编写的模块遇到的前端代码扫描出现的sql注入问题,给出部分解决方案。
错误示例
请求api时,参数未加效验;
let _obj ={
pageSize: pageSize,
pageNum: pageNum,
sort: sort,
type:pharType,
};
return api.callApi("/navmark/sx_phar/list", _obj)
.then((res) => {
dataList.value =setPharImg(res.data); data.cur_id="";
});
此时扫描的错误为:
Web应用程序对用户输入数据的合法性没有进行判断和过滤,攻击者可以通过控制可控参数来构造不同的SQL语句来实现对数据库的任意操作。比如查询、删除,增加,修改数据等等,严重时还可以对操作系统执行命令。
正确操作
前端校验:
let _obj ={
pageSize: pageSize,
pageNum: pageNum,
sort: sort,
type:pharType,
};
let flag =checkSqlsIn(_obj);if(flag){proxy.$modal.msgError("存在非法输入");return}
return api.callApi("/navmark/sx_phar/list", _obj)
.then((res) => {
dataList.value =setPharImg(res.data); data.cur_id="";
});
//SQL注入常见字符
var sqlKeyWords = "select ,union ,asc ,desc ,in ,like ,into ,exec ,from ";
sqlKeyWords += ",update ,insert ,delete ,count ,asc( ,char( ,chr( ,drop ,table ,truncat ";
sqlKeyWords += ",mid( ,abs( ,= ,-- ,<script ,/script ";
sqlKeyWords += ",where ,join ,create ,alter ,cast ,exists ,; , or , and ,order by ,group by ";
//分割成数组
var sqls = sqlKeyWords.split(",");
function checkSqlsIn(_obj) {
let lxdInput = JSON.stringify(_obj);
let invalid = false;
let chkInput = (lxdInput + "").toLowerCase();
let pos = -1;
for (let i = 0, n = sqls.length; i < n; i++) {
pos = chkInput.indexOf(sqls[i]);
if (pos != -1) {
invalid = true;
break;
}
}
return invalid;
}
对提交的参数进行合法化效验,上面的校验只是匹配了部分sql常见字符。其他的自行补充
后端校验:后端使用不同语言的可能校验方式可能有所区别,大概思路类似,要么预编译sql语句,要么先校验参数合法性。