防止sql注入风险

667 阅读2分钟

1、这次是公司的项目在登录页面上的限制太少了,导致可能存在sql注入风险

先说解决sql注入的方法:
1.在网页代码中需要对用户输入的数据进行严格过滤。
2.部署 Web 应用防火墙
3.对数据库操作进行监控 建议过滤用户输入的数据,切记用户的所有输入都要认为是不安全的。\

对于我们码农来说第2种和第3种就不太现实了嘛,所以一般我们都是在代码上做操作,对用户输入的数据进行一个过滤,我是在前后端的代码上都进行了一个限制,双重保险来确保sql注入不了。

前端代码限制:

/*验证手机号*/
var nameReg = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
if(loginName.length!=11 || !nameReg.test(loginName)){
  $.messenger("请输入正确的手机号码,禁止输入非法字符",1);
  return false;
}

/*验证密码,密码为6到12的纯数字*/
var passReg = /^[0-9]{6,12}$/
if(!passReg.test(passWord)) {
  $.messenger("请输入正确的密码格式,禁止输入非法字符且密码为6到12的数字组成", 1);
  return false;
}


后端代码过滤:
先写了一个验证是否有sql注入风险的工具类

/**
 * 
 * @description  验证是否有sql注入风险
 * @param
 * @return
 * @author huang
 * @date 2022/8/5 10:52
 */
public class SQLDanger {

    public static boolean sql_check(String str){
        String sql_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
        String sql_stra[] = sql_str.split("|");
        for (int i=0 ; i < sql_stra.length ; i++ ){
            if (str.indexOf(sql_stra[i])>=0){
                return true;
            }
        }
        return false;
    }
}

然后在取到用户输入的数据后进一个判断,有问题就抛出异常

String name = paramsJson.get("name").toString();
String passWord = paramsJson.get("passWord").toString();
if(SQLDanger.sql_check(name) || SQLDanger.sql_check(passWord)){
   logger.error("非法输入,请检查是否有sql注入风险");
   throw new Exception("非法输入,请合法操作");
}

这次需求遇到的问题(重点):

1、前端html代码中正则表达式只能是,不能new

//前端
var nameReg = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;


//不可用
var nameReg = new RegExp('^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$')

最后:

这个需求我们主管以为是个系统漏洞,可能搞起来要很久,居然给我三天时间,我一听到三天就偷偷笑了,我当天下午就给他搞完了,含泪摸了两天鱼。。。。