专栏首页Java全栈什么是SQL注入?如何预防?

什么是SQL注入?如何预防?

1 准备工作

本次演示使用的是目前最热门的Java快速开发架构:SpringBoot2.3.4 + Mybatis + Mysql8

先准备一张测试表:

drop table if exists `test`;
create table `test` (
  id bigint not null comment 'id',
  name varchar(50) comment '名称',
  primary key (`id`)
) engine=innodb default charset=utf8mb4 comment='测试';

insert into `test` (id, name) values (1, 'test1');
insert into `test` (id, name) values (2, 'test2');

TestController:

@RequestMapping("/find")
public List<Test> test(@RequestBody Map<String, String> map) {
    return testService.find(map.get("id"));
}

TestService:

public List<Test> find(String id) {
    return testMapper.find(id);
}

TestMapper.java:

public List<Test> find(@Param("id") String id);

TestMapper.xml:

<select id="find" resultType="com.jiawa.demo.domain.Test">
    select `id`, `name` from `test` where id = #{id}
</select>

测试:test.http(使用IDEA自带的HttpClient)

GET http://localhost:8080/test/find
Content-Type: application/json
Accept: application/json

{
  "id": "1" # 改为3则查不出数据,表里没id=3
}

测试结果:查出id=1的数据,修改test.http,改为3,则查不出数据

[
  {
    "id": "1",
    "name": "test1"
  }
]

上面这些都是正常的代码,演示结果也正常

2 注入演示:获取数据

由于手滑,把xml里的#,写成了$

<select id="find" resultType="com.jiawa.demo.domain.Test">
    select `id`, `name` from `test`  where id = ${id}
</select>

测试正常值id=1,能查出数据,但是如果脚本参数改为这样

GET http://localhost:8080/test/find
Content-Type: application/json
Accept: application/json

{
  "id": "3 or 1=1"
}

结果:表里所有的数据全部都查出来了!

[
  {
    "id": "1",
    "name": "test1"
  },
  {
    "id": "2",
    "name": "test2"
  }
]

3 注入演示:删除数据

现在我在数据库连接里增加一个参数,xml里还是手滑,写成$:

allowMultiQueries=true (不知道怎么看开启的可以看视频)
...
select `id`, `name` from `test` where id = ${id}

脚本写成这样:

GET http://localhost:8080/test/find
Content-Type: application/json
Accept: application/json

{
  "id": "1; delete from test"
}

结果:表里的数据全没了!!!

4 如何预防

总结如下三点,具体可以看视频:

  1. 使用#代替$,使用PreparedStatement代替SQL拼接
  2. 后端记得做参数校验,后端永远不要相信前端
  3. 打开allowMultiQueries要慎重,尽量不要打开

5 高频面试题

Q:什么是SQL注入?如何预防?

A:通过输入特定的参数来改变SQL意图,可以将演示的注入现象简述一遍。如何预防见上面第4点。

Q:Mybatis里#和$的区别是什么?

A:这两个都可以用来传递变量。#对应会变成占位符"?",可防止注入。$是简单的值传递,是啥填啥。

Q:Mybatis和JDBC什么关系?

A:或问Mybatis原理是什么?Mybatis就是封装了JDBC。

Q:SQL日志里的“?”是什么作用?

A:或问:JDBC中的“?”是什么作用?"?"是Mysql中预编译功能的占位符。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python如何防止sql注入

    豌豆贴心提醒,本文阅读时间10分钟 前言 web漏洞之首莫过于sql了,不管使用哪种语言进行web后端开发,只要使用了关系型数据库,可能都会遇到sql注入攻...

    小小科
  • 什么是 SQL 注入攻击?

    SQL 注入就是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,服务器拿到这个字符串之后,会把这个字符串作为 sql 的执行参数去...

    帅地
  • 如何全面防御SQL注入

    随着技术的进步,Web应用技术在得以快速发展的同时,其自身的漏洞和伴随的风险也在不断迭代与增加着。自2003年以来,SQL注入攻击已持续位列OWASP应用安全风...

    二月春风似剪刀
  • 四十六、什么是SQL注入

    SQL 注入是指应用程序对用户输入数据的合法性没有判断、没有过滤,攻击者可以在应用程序中通过表单提交特殊的字符串,该特殊字符串会改变 SQL 的运行结果,从而在...

    喵叔
  • 轻松理解什么是 SQL 注入

    作为长期占据 OWASP Top 10 首位的注入,OWASP 对于注入的解释如下:

    信安之路
  • 网站如何防止sql注入攻击

    移动互联网的发展势头已经远远超过PC互联网,手机移动端上网,以及持有量远超PC电脑,随着移动大数据、区块链的技术在不断的完善,成熟,日常生活中经常会听到某某网站...

    网站安全专家
  • 如何有效防止SQL注入攻击

    SQL注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐...

    Java旅途
  • 什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?

    唐怀瑟
  • Java SQL注入危害这么大,该如何来防止呢?

    直接使用 JDBC 的场景,如果代码中存在拼接 SQL 语句,那么很有可能会产生注入,如

    搜云库技术团队
  • ASP.NET中如何防范SQL注入式攻击

    1将sql中使用的一些特殊符号,如' -- /* ; %等用Replace()过滤; 2限制文本框输入字符的长度; 3检查用户输入的合法性;客户端与服务器端...

    Java架构师必看
  • 简单分析什么是SQL注入漏洞

    现在很多人在入侵的过程中基本都是通过SQL注入来完成的,但是有多少人知道为什么会有这样的注入漏洞呢?有的会随口说着对于字符的过滤不严造成的。但是事实是这样吗?我...

    shirayner
  • sql语句是什么,如何做到从入门到精通

    sql语句对于很多人来说并不知道它是什么,但是对于计算机领域的人来说,就尤其的熟悉了。sql语句的英文全名叫做Structured Query Langeage...

    用户8739990
  • 什么是CC攻击?如何有效防御?

    CC攻击其实属于DDoS攻击的一种,其原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。这种攻击普遍都是流量不是很高,...

    墨者安全科技
  • 什么是防火墙以及它如何工作?

    防火墙是一种通过基于一组用户定义的规则过滤传入和传出网络流量来提供网络安全性的系统。通常,防火墙的目的是减少或消除不需要的网络通信的发生,同时允许所有合法通信自...

    新巴子
  • 网站如何防止sql注入攻击的解决办法

    首先我们来了解下什么是SQL注入,SQL注入简单来讲就是将一些非法参数插入到网站数据库中去,执行一些sql命令,比如查询数据库的账号密码,数据库的版本,数据库服...

    网站安全专家
  • BGP高防IP如何防DDos和cc攻击?原理是什么?

    高防服务器又称为BGP高防ip,无论你的业务在哪里,都可以使用DDos及cc防护。如果业务不在,只需把需要防护的设备绑定高防即可防护,无需任何配置。

    JunyouYH
  • 什么是死锁?死锁发生的四个必要条件是什么?如何避免和预防死锁产生?

    Kevin_Zhang
  • Laravel Jetstream是什么以及如何入门?

    Laravel Jetstream 与 Laravel 8 一起于2020年9月8日发布。

    Lemon黄
  • com是什么域名 要如何注册域名

    在我们的日常生活当中,域名是比较常见的,有时候别人递过来的名片上面就有着域名,当我们进入网站的时候,也是需要域名的。com看上去十分的简单。大家知道com是什么...

    用户8715145

扫码关注云+社区

领取腾讯云代金券