注解用法

@Value

就是将我们配置文件中的属性读出来

@Value的值有两类: ① ${ property : default_value } ② #{ obj.property? :default_value } 第一个注入的是外部配置文件对应的property,第二个则是SpEL表达式对应的内容。 那个 default_value,就是前面的值为空时的默认值。注意二者的不同,#{}里面那个obj代表对象。

@PostMapping

映射一个POST请求:

@GetMapping,处理get请求 @PostMapping,处理post请求 @PutMapping,处理put请求 @DeleteMapping,处理delete请求

  1. @PostMapping(value = "/user/login") 等价于
  2. @RequestMapping(value = "/user/login",method = RequestMethod.POST)

@RequestPart/@RequestParam

用来获取文件表单的参数。
区别:

@RequestPart支持的请求方法的方式MultipartFile,属于Spring的MultipartResolver类,通过http协议传输,@RequestParam适用于name-value “String”类型的请求域,@RequestPart适用于复杂的请求域(像JSON,XML)

SQL注入

使用Mybatis作为数据持久层框架,将程序中大量SQL语句剥离出,配置再配置文件中,实现SQL的灵活配置。
防止SQL注入:

  • 将${} 替换为 #{}即可 原理: #{}告诉Mybatis创建一个预编译语句,在JDBC中,这个参数由?识别,并传递到一个新的预编译处理语句中
  • ${} 仅仅是纯粹的 string 替换,在动态 SQL 解析阶段将会进行变量替换,类似于直接替换字符串,会导致SQL注入产生。

不能使用#{}的场景如下:

  1. 表名/字段名

    在替换字符串时会带上单引号,但是若是表名/字段名加上单引号则会报错(可以使用``)

  2. order by/group by

    使用白名单进行筛选,若传入的字段不存在则执行默认的

  3. like模糊查询

  4. in

SQL注入的代码审计:

  • 查看SQL语句中是否使用拼接 ```sql

JDBC中的拼接,关注+:

sqlString.append(“select * from user where uid=’”+ UID +”‘“);

JDBC中的预编译:

sqlString.append(“select * from user where uid= ?”);

Hibernate中的拼接:

sql.append(“select * from user where uid = ‘“ + UID + “‘“); List result = session.createQuery(queryString).list();

Hibernate中的预编译

sql.append(“select * from user where uid = :UID”); paramters.setString(“UID”, UID); ```

  • 若存在拼接参数,则逆向追踪拼接的参数传入过程,逆向追踪参数的路径大致为:Mapper -> Dao -> ServiceImpl -> Controller

并不是所有拼接的参数都会存在注入:

  • 参数不是用户传进来的
  • 参数不是字符串类型,只能传入数字
  • 参数在过程中已经转义或过滤,需要考虑是否能够绕过。