开发指南038-防SQL注入

简介: 这个是检查某个字符串是否含注入的SQL,为基本函数

 系统里大量存在查询界面,例如A框为模糊查询条件,里面输入文字a,系统后台会拼接SQL条件 A like '%a%'。B框为等于条件,输入b,后台翻译为B='b'。看起来没有什么问题,但是偏偏黑客哥会使用这个漏洞,例如B=‘b'这个,黑哥会在录入框里输入1' or '1'='1,带入后得到

B='1' or '1'='1' 成了永真条件,造成数据泄露,这就是SQL注入。防止起来也没什么秘密,检查下输入条件,避免出现% or 等。问题在于系统中这样的地方太多,写起来代码量太大。平台提供的基本方案如下:

public static boolean sql_inj(String str){
        //这里是注入关键词可以根据需要进行增加或者修改。
        String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|+|=";
        String[] inj_stra=inj_str.split("\\|");
        for (int i=0 ; i < inj_stra.length ; i++ ){
            if (str.indexOf(inj_stra[i])>=0){
                return true;
            }
        }
        return false;
    }

image.gif

这个是检查某个字符串是否含注入的SQL,为基本函数。前面讲过所有接口的参数都是一个输入的对象,挨个检查这个对象里对应属性值即可,最终方案如下:

   // 通用检查查询参数

   public static boolean sql_inj(Object o,String fields){

       CommonsUtil.debugLog("==sql_inj o="+o+" fields="+fields);

       String []fs=fields.split(",");

       for(int i=0;i<fs.length;i++){

           String value=reflectUtils.getFieldValueByName(o,fs[i]);

           if (value!=null && !"".equals(value) && sql_inj(value)) {

               CommonsUtil.debugLog("feild="+fs[i]+" value="+value);

               return true;

           }

       }

       return false;

   }

fields是要求检查的属性名字,例如:“name,idcard”

reflectUtils.getFieldValueByName里有反射机制获取属性信息,下篇将介绍反射

整体效果:

public PageResult<EvaKeyItemDTO> getKeyItemListBySetId(@RequestBody EvaKeyItemRequestDTO dto) {
        PageResult<EvaKeyItemDTO> rsPage = new PageResult(BaseController.getURI(), dto);
        // 防sql注入
        if (CommonsUtil.sql_inj(dto,"itemName,itemType,validFlag,lowValue,highValue")){
            rsPage.setRetCode(IOResultEnum.INVAILD_PARAMTER.getKey());
            rsPage.setMsg("查询条件中非法注入了SQL");
            return rsPage;
        }

image.gif


相关文章
|
SQL BI 数据库
达梦(DM) SQL日期操作及分析函数
讲述DM 数据库中如何实现各种日期相关的运算以及如何利用分析函数 lead() over() 进行范围问题的处理
|
SQL Serverless 数据库
|
SQL 机器学习/深度学习 自然语言处理
达梦(DM) SQL函数相关
讲述 DM 数据库函数
|
SQL 数据库
达梦(DM) SQL数据及字符串操作
继续讲述DM数据库Sql操作
|
SQL 数据库
达梦(DM) SQL查询及联合查询
继续讲解达梦(DM)数据库SQL查询操作
|
29天前
|
SQL
开发指南057-执行SQL返回结果集
业务实践中除了返回实体类外,经常需要通过SQL语句返回结果集
|
SQL 关系型数据库 MySQL
达梦(DM) SQL基础操作
讲述达梦 DM数据库 SQL基础查询语句
|
SQL 运维 Cloud Native
【SQL Server】数据库开发指南(五)T-SQL 高级查询综合应用与实战
T-SQL 是 SQL Server 的专用版本,提供了一组强大的高级查询功能,包括聚合函数、子查询、连接、视图、窗口函数、共享表达式、递归查询等。这些功能使得 T-SQL 可以轻松处理大量数据,并支持各种复杂的查询和数据操作。本文将介绍 T-SQL 的一些常见高级查询功能和语法,以及如何使用这些功能来优化 SQL Server 数据库的性能和效率。
261 1
【SQL Server】数据库开发指南(五)T-SQL 高级查询综合应用与实战
|
SQL 存储 数据挖掘
【SQL Server】数据库开发指南(三)面向数据分析的 T-SQL 编程技巧与实践
T-SQL 指的是 Transact-SQL,是一种针对 Microsoft SQL Server 数据库系统的 SQL 方言。T-SQL 扩展了标准 SQL 语言,提供了更多的功能和特性,包括事务处理、错误处理、游标处理、动态 SQL、存储过程、触发器、用户定义函数等等。
170 0
【SQL Server】数据库开发指南(三)面向数据分析的 T-SQL 编程技巧与实践
|
SQL 存储 缓存
【笔记】开发指南—SQL调优指南—SQL调优进阶—查询执行器介绍
本文介绍PolarDB-X的SQL执行器如何执行SQL中无法下推的部分。
133 0
【笔记】开发指南—SQL调优指南—SQL调优进阶—查询执行器介绍