1. 创建 API

1.1 创建 SpringBoot 工程 this-user-api

1.2 创建实体类 User

@Entity
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)// 指定该属性为底层数据库的主键策略
    private Long id;

    @Column
    private String name;

    @Column(unique = true)
    @NotBlank(message = "用户名不能为 null")
    private String username;

    @Column
    @NotBlank(message = "密码不能为null")
    private String password;

    public UserInfo buildInfo(){
        UserInfo info = new UserInfo();
        BeanUtils.copyProperties(this,info);
        return info;
    }
}

该工程引入 lombok 。

1.3 定义数据库 user

CREATE TABLE `imooc-security`.`user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

1.4 创建增、删、改、查四个 API 接口

 

2. 启动程序、测试

测试工具: google 安装 aejoelaoggembcahagimdiliamlcdmfm_25.7.0_chrome.zzzmh.cn 插件

2.1 正常查询

(1)访问API

返回当前查询的 name = jojo1  的用户信息

2.2 SQL注入攻击演示

(1)注入攻击查询

查询结果:

2.3 Debug 调试 SQL 注入攻击的原因

在代码中可以看出,name='or 1=1 or name= ' 被处理后直接拼接到了 where 子句中成为了 where name=' ' or 1=1 or name = ''  ,  由于判断语句 or 1=1 恒成立,所以结果为真,直接查询所有的用户信息。

2.4 解决方案

方案1:使用#{id}占位符的预防来设置值,可以有效防止SQL注入。

方案2:使用 Spring Data JPA ,其底层自动做了防止SQL注入的机制

 

本节主要讲了sql注入防范,如果使用mybatis,需要注意mapper.xml里面$会造成sql注入风险。

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐