MyBatis最佳实践:SQL注入问题

server/2025/1/23 12:15:23/

什么是 SQL 注入:

  1. SQL 注入是一种注入攻击,可以执行恶意 SQL 语句,它将任意 SQL 代码插入数据库查询,使攻击者能够完全控制 WEB 应用程序后面的数据库服务器,攻击者可以使用 SQL 注入漏洞绕过程序安全措施
  2. 可以绕过网页或 WEB 应用程序的身份验证和授权,并检索中整个 SQL 数据库的内容
  3. 还可以使用 SQL 注入来添加、修改和删除数据库中的记录
  4. 简单来说:
    1. SQL 注入是一种将 SQL 代码添加到输入参数中,传递到 SQL服务器解析并执行的一种攻击手法,传入参数未经过过滤,直接拼接到 SQL 语句中,解析执行,达到预先之外的行为
  5. SQL注入案例:
    name = 'addss' and password = 1' or '1' = '1

SQL注入解决:

  1. JDBC解决:
    1. 把 SQL 语句中需要传参的位置用 ?占位符给替换
    2. 更改 Statement 对象为 PreparedStatement对象:
      //传入参数地方用占位符 ? 替换
      select * from student where name = ? and password = ?//未改动前语句: Statement statement = (Statement) connection.createStatement();//更改 Statement 对象为 PreparedStatement //获取对象并编译sql      
      PreparedStatement statement = (PreparedStatement) connection.prepareStatement(sql);
      //给占位符赋值
      statement.setString(1, name);
      statement.setString(1, password);
    3. 解决方式:
      1. 使用 PreparedStatement 对象是先将 SQL 语句的骨架发送给服务器编译并确定下来,编译之后 SQL 语句的骨架和语义就不会再被改变了,再将 SQL 语句中的参数发送给服务器
      2. 即使参数中再包含 SQL 关键字或者特殊符号,也不会导致 SQL 语句的骨架或语义被改变,只会被当作普通的文本来处理
    4. 解决步骤:
      1. 使用 PreparedStatement 对象代替 Statement 对象传输 SQL 语句骨架,并返回一个 PreparedStatment 对象
        PreparedStatement ops = oCn.preparedStatemnt(sql);
        //说明:一个 SQL 语句骨架指的是使用 ? (占位符) 代替自定义变量后的 SQL 语句示例:select * from user where name = ? and password = ?;该方法使用一个 PreparedStatement 对象值对应一条 SQL 语句骨架,想要使用其他 SQL 语句骨架就得重新创建一个该类的对象
      2. 使用 PreparedStatement 的类方法 setBaseType(占位符序号,变量名);构造实参,填充占位符
        1. SQL 骨架中有多少个 ?就得使用该类方法构造多少个实参
        2. 该类方法第一个实参指的是占位符的服啊后,序号是从 1 开始的,区别与下标
        3. 构造的实参必须与占位符的序号 一 一 对应
        4. 方法名中的 BaseType 指的是不同类型的数据要使用对应类型的 set 方法,如类型 int 数据,则使用 setInt 方法构造实参
      3. 将填充完的 SQL 语句传输给数据库:
        oPs.executeQurey() 或 oPs.executeUpdate() 方法传输构造好的 SQL 语句
    5. 优点:
      1. 使用 PreparedStatement 对象可以防止 SQL 注入攻击
      2. 而且通过方法设置参数更加的方便且不易出错
      3. 还可以从某方面提高程序执行的效率
  2.  #{} 和 $ value} 符号:
    1. ${value}:数据拼接,在本地 SQL 语句进行拼接(会有 SQL 注入问题)
    2. #{}:占位符 ==> 被编译成占位符  ?
    3. 两者的选择:
      1. 能用 #{} 就用 #{},尽量少用 ${}
      2. 当数据作为参数,或者 order by 排序时用 ${}
      3. 传参时参数使用  @Param 注解,
      4. 正确的将参数传入 SQL 语句中,一般通过 #{} 的方式,${} 会有 SQL 注入的问题
    4. 原理:
      1. MyBatis 的 #{} 之所以能够预防 SQL 注入是因为底层使用了 PreparedStatment 类 setString() 方法来设置参数
      2. 此方法会获取参数传递过来的每个字符,然后进行循环对比,如果发现有敏感字符(如:单引号、双引号等),则会在上面加一个 '/' 代表转义符号,让其变成一个普通的字符串,不参与 SQL 语句的生成,达到预防 SQL 注入的效果

http://www.ppmy.cn/server/160729.html

相关文章

解码策略(Top-k Top-p Temperature)

0.简介 在大模型训练好之后,如何对训练好的模型进行解码(decode)是一个火热的研究话题。 一般给模型传入的解码参数如下所示。 {"top_k": 10,"temperature": 0.95,"num_beams": 1,"top_p": 0.8,

基于微信小程序的驾校预约小程序

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

计算机视觉算法实战——实体物体跟踪

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​ ​ 1. 领域介绍✨✨ 实体物体跟踪(Object Tracking)是计算机视觉领域中的一个重要研究方向&#x…

PyTorch使用教程(11)-cuda的使用方法

1. 基本概念 CUDA(Compute Unified Device Architecture)是NVIDIA开发的一种并行计算平台和编程模型,专为图形处理器(GPU)设计,旨在加速科学计算、工程计算和机器学习等领域的高性能计算任务。CUDA允许开发…

Kafka中bin目录下面kafka-run-class.sh脚本中的JAVA_HOME

在Kafka中,bin目录下面的kafka-run-class.sh脚本中关于JAVA_HOME的脚本如下: # Which java to use if [ -z "$JAVA_HOME" ]; thenJAVA"java" elseJAVA"$JAVA_HOME/bin/java" fi 这段脚本是关于决定在执行 Kafka 时应该使…

HTML 基础入门:核心标签全解析

在网页开发的世界里,HTML(超文本标记语言)是基石般的存在。它负责构建网页的基本结构,为用户呈现出丰富多样的内容。今天,就让我们一起深入了解 HTML 中几个极为关键的基础标签,开启网页创作的第一步。 一…

[Spring] OpenFeign的使用

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

【大模型】ChatGPT 高效处理图片技巧使用详解

目录 一、前言 二、ChatGPT 4 图片处理介绍 2.1 ChatGPT 4 图片处理概述 2.1.1 图像识别与分类 2.1.2 图像搜索 2.1.3 图像生成 2.1.4 多模态理解 2.1.5 细粒度图像识别 2.1.6 生成式图像任务处理 2.1.7 图像与文本互动 2.2 ChatGPT 4 图片处理应用场景 三、文生图操…