码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • mybatis防注入


    1.SQL防注入

    mybatis语句中要使用 #{xxx}防止SQL注入,${xxx}只是简单替换占位符,有注入的风险

    例子:

    1.1

    "getNameByUserId" resultType="String"> SELECT name FROM user where id = #{userId}

    可以看到输入的参数是String类型的userId,当我们传入userId="34;drop table user;"后,打印的语句是这样的:

    select name from user where id = ?

    这就得益于mybatis在底层实现时使用预编译语句。数据库在执行该语句时,直接使用预编译的语句,然后用传入的userId替换占位符?就去运行了。不存在先替换占位符?再进行编译的过程,因此SQL注入也就没有了生存的余地了。

    mybatis是如何做到sql预编译的呢?其实框架底层使用的正是PreparedStatement类。PreparedStaement类不但能够避免SQL注入,因为已经预编译,当N次执行同一条sql语句时,节约了(N-1)次的编译时间,从而能够提高效率。

    【底层实现原理】

          其原因就是:采用了JDBC的PreparedStatement,就会将sql语句:“select id,no from user where id =?” 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该SQL语句的语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如select,from,where,and,or,order by等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些SQL命令的执行,必须先得通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为SQL命令来执行的,只会被当做字符串字面值参数。所以的sql语句预编译可以防御SQL注入。而且在多次执行同一个SQL时,能够提高效率。原因是SQL已编译好,再次执行时无需再编译。

    1.2

    如果将上面的语句改成:

    "getNameByUserId" resultType="String"> SELECT name FROM user where id = ${userId}  -- 注意与1.1的对比

    当我们输入userId="34;drop table user;"后,打印的语句是这样的:

    select name from user where id = 34;drop table user;

    mybatis没有使用预编译语句,它会先进行字符串拼接再执行编译,这个过程正是SQL注入生效的过程。

    在MyBatis中,“ $ {xxx}”这样格式的参数会直接参与SQL 编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用$ {xxx}“这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。

    #{}:相当于JDBC中的PreparedStatement的

    $ {}:是输出变量的值

    简单说,

    # {}是经过预编译的,是安全的 ; 

    $ {}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。

  • 相关阅读:
    Linux篇---第一篇
    软件工程成本/效益分析:开发一个软件系统是一种投资,期望将来获得更大的经济效益。 系统的经济效益=使用新系统而增加的收入+使用新系统可以节省的运行费用。
    装备制造业为何需要重视工业软件?
    RT-DETR手把手教程,注意力机制如何添加在网络的不同位置进行创新优化
    基于bootstrap的二维码支付系统webAPP设计
    Spring Data Envers:使用实体修订进行审计
    跨境电商建站:选择域名需要注意什么?
    ESP8266-Arduino编程实例-BMP180气压温度传感器驱动
    Nginx(六) Nginx location 匹配顺序及优先级深究(亲测有效)
    过滤器(Filter)和拦截器(Interceptor)有什么不同?
  • 原文地址:https://blog.csdn.net/whupanyinghua/article/details/131147106
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号