Spring Cloud微服务安全实战_1-2_API安全 第一个API及注入攻击防护

注入攻击

注入攻击是web安全领域中一种最为常见的攻击方式。注入攻击的本质,就是把用户输入的数据当做代码执行。这里有两个关键条件,第一是用户能够控制输入,第二个就是原本程序要执行的代码,将用户输入的数据进行了拼接,所以防御的思想就是基于上述两个条件。

PS:OWASP Top 10是针对开发人员和Web应用程序安全性的标准意识文档。它代表了对Web应用程序最严重的安全风险的广泛共识。注入攻击(injection)排在第一位。

SQL注入攻击(SQL injection)是目前网站安全以及服务器安全层面上是最具有攻击性,危害性较高,被黑客利用最多的一个漏洞,基本上针对于网站代码,包括JAVA JSP PHP ASP apache tomcat 语言开发的代码都会存在sql注入漏洞。

SQL注入攻击代码案例

比如我们想通过用户名查询用户信息:

Spring Cloud微服务安全实战_1-2_API安全 第一个API及注入攻击防护_第1张图片

但是当我们稍微改下传参 结果就会查出所有的用户信息

Spring Cloud微服务安全实战_1-2_API安全 第一个API及注入攻击防护_第2张图片

UserController

package com.xdarker.security.controller;

import com.xdarker.security.dto.UserDto;
import com.xdarker.security.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Created by XDarker
 * @Description TODO
 * @Date 2020/3/1 15:20
 */
@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    
    @GetMapping
    public List query(String name) {

        String sql = "select * from user where name = '" + name + "'";
        List list = jdbcTemplate.queryForList(sql);
        return list;
//        return userService.query(name);
    }
}




sql:"select * from user where name = '" + name + "'"
分析SQL语句: 条件后面name=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;

mybatis 解决 SQL 注入问题

我们使用 mybatis 编写 SQL 语句时,难免会使用模糊查询的方法,mybatis 提供了两种方式 #{} 和 ${} 。

  • #{value} 在预处理时,会把参数部分用一个占位符 ? 替代,其中 value 表示接受输入参数的名称。能有效解决 SQL 注入问题
  • ${} 表示使用拼接字符串,将接受到参数的内容不加任何修饰符拼接在 SQL 中,使用${}拼接 sql,将引起 SQL 注入问题。

pom文件




  4.0.0

  com.xdarker.security
  is-user-api
  1.0-SNAPSHOT
  war

  
    UTF-8
  

  
    
      org.springframework.boot
      spring-boot-starter-web
    

    
      org.projectlombok
      lombok
    

    
      org.springframework.boot
      spring-boot-starter-jdbc
    

    
      mysql
      mysql-connector-java
    

    
      org.springframework.boot
      spring-boot-starter-data-jpa
    

    
      com.google.guava
      guava
      28.2-jre
    

    
      org.apache.commons
      commons-lang3
    

  


  
    
      
        
        org.springframework.boot
        spring-boot-dependencies
        2.2.5.RELEASE
        pom
        import
      
    
  

用户对象User

package com.xdarker.security.entity;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 * @Created by XDarker
 * @Description TODO
 * @Date 2020/3/1 15:15
 */
@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String username;
    private String password;
}

 

你可能感兴趣的:(SpringCloud,SpringCloud,Spring,Security,微服务安全,SQL注入,注入攻击)