返回顶部
首页 > 资讯 > 数据库 >如何有效防止sql注入
  • 875
分享到

如何有效防止sql注入

2024-04-02 19:04:59 875人浏览 八月长安
摘要

如何有效防止sql注入?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。@RestController public c

如何有效防止sql注入?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

@RestController
public class Controller {
  
  @Autowired
  SqlInject sqlInject;
  
  @GetMapping("list")
  public List<Course> courseList(@RequestParam("studentId") String studentId){
    List<Course> orders = sqlInject.orderList(studentId);
    return orders;
  }
}
@Service
public class SqlInject {

  @Autowired
  private JdbcTemplate jdbcTemplate;
  
  public List<Course> orderList(String studentId){
    String sql = "select id,course_id,student_id,status from course where student_id = "+ studentId;
    return jdbcTemplate.query(sql,new BeanPropertyRowMapper(Course.class));
  }
}

二 注入攻击演示

1. 正常情况下查询一个学生所选课程及完成情况只需要传入student_id,便可以查到相关数据。

如何有效防止sql注入

根据响应结果,我们很快便能写出对应的sql,如下:

select id,course_id,student_id,status 
from course 
where student_id = 4

2. 如果我们想要获取这张表的所有数据,只需要保证上面这个sql的where条件恒真就可以了。

select id,course_id,student_id,status 
from course 
where student_id = 4 or 1 = 1

请求接口的时候将studendId 设置为4 or 1 = 1,这样这条sql的where条件就恒真了。sql也就等同于下面这样

select id,course_id,student_id,status 
from course

请求结果如下,我们拿到了这张表的所有数据

如何有效防止sql注入

3. 查询Mysql版本号,使用uNIOn拼接sql

union select 1,1,version(),1

如何有效防止sql注入

4. 查询数据库

union select 1,1,database(),1

如何有效防止sql注入

5. 查询mysql当前用户的所有库

union select 1,1, (SELECT GROUP_CONCAT(schema_name) FROM infORMation_schema.schemata) schemaName,1

如何有效防止sql注入

看完上面这些演示后,你害怕了吗?你所有的数据配置都完全暴露出来了,除此之外,还可以完成很多操作,更新数据、删库、删表等等。

三 如何防止sql注入

1. 代码层防止sql注入攻击的最佳方案就是sql预编译

public List<Course> orderList(String studentId){
  String sql = "select id,course_id,student_id,status from course where student_id = ?";
  return jdbcTemplate.query(sql,new Object[]{studentId},new BeanPropertyRowMapper(Course.class));
}

这样我们传进来的参数 4 or 1 = 1就会被当作是一个student_id,所以就不会出现sql注入了。

2. 确认每种数据的类型,比如是数字,数据库则必须使用int类型来存储

3. 规定数据长度,能在一定程度上防止sql注入

4. 严格限制数据库权限,能最大程度减少sql注入的危害

5. 避免直接响应一些sql异常信息,sql发生异常后,自定义异常进行响应

6. 过滤参数中含有的一些数据库关键词

@Component
public class SqlInjectionFilter implements Filter {
  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
    httpservletRequest req=(HttpServletRequest)servletRequest;
    HttpServletRequest res=(HttpServletRequest)servletResponse;
    //获得所有请求参数名
    Enumeration params = req.getParameterNames();
    String sql = "";
    while (params.hasMoreElements()) {
      // 得到参数名
      String name = params.nextElement().toString();
      // 得到参数对应值
      String[] value = req.getParameterValues(name);
      for (int i = 0; i < value.length; i++) {
        sql = sql + value[i];
      }
    }
    if (sqlValidate(sql)) {
      throw new IOException("您发送请求中的参数中含有非法字符");
    } else {
      chain.doFilter(servletRequest,servletResponse);
    }
  }

  
  protected static boolean sqlValidate(String str) {
    // 统一转为小写
    str = str.toLowerCase();
    // 过滤掉的sql关键字,可以手动添加
    String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|" +
        "char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like'|and|exec|execute|insert|create|drop|" +
        "table|from|grant|use|group_concat|column_name|" +
        "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|" +
        "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";
    String[] badStrs = badStr.split("\\|");
    for (int i = 0; i < badStrs.length; i++) {
      if (str.indexOf(badStrs[i]) >= 0) {
        return true;
      }
    }
    return false;
  }
}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: 如何有效防止sql注入

本文链接: https://lsjlt.com/news/55674.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何有效防止sql注入
    如何有效防止sql注入?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。@RestController public c...
    99+
    2024-04-02
  • 如何有效防止sql注入的方法
    SQL注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐,相当大一部分程序员在...
    99+
    2024-04-02
  • 怎么有效防止sql注入
    这期内容当中小编将会给大家带来有关怎么有效防止sql注入,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一 背景数据如下:本系统采用mysql做为数据库,使用Jdbc来进行数据库的相关操作。系统提供了一个功...
    99+
    2023-06-15
  • 怎么才能有效防止SQL注入
    这篇文章主要为大家展示了“怎么才能有效防止SQL注入”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么才能有效防止SQL注入”这篇文章吧。sql注入入门SQL ...
    99+
    2024-04-02
  • 怎么有效防止SQL注入攻击
    这篇文章主要介绍“怎么有效防止SQL注入攻击”,在日常操作中,相信很多人在怎么有效防止SQL注入攻击问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么有效防止SQL注入攻击”...
    99+
    2024-04-02
  • like如何防止sql注入
    like防止sql注入的示例:在不同数据库下的用法不同,例如://mysql环境select * from test where school_name like concat('%',${name},'%')...
    99+
    2024-04-02
  • nodejs如何防止sql注入
    nodejs防止sql注入的方法:使用escape()对传入参数进行编码,例如:var userId = 1, name = 'test';var query = connection.query('SELECT * FROM us...
    99+
    2024-04-02
  • html如何防止sql注入
    html防止sql注入的方法:批量过滤post、get敏感数据,例如:$_GET = stripslashes_array($_GET);$_POST = stripslashes_array($_POST);使用数据过滤函数,例如:fun...
    99+
    2024-04-02
  • oracle如何防止sql注入
    oracle防止sql注入的方法:oracle中的DBMS_ASSERT包中包含了相关的函数,将传入的参数进行检查,若不符合相关规则,那sql语句执行会报错,从而达到防止sql注入的风险,例如:ENQUOTE_LITERAL:输入字符串,并...
    99+
    2024-04-02
  • ssh如何防止sql注入
    ssh防止sql注入的方法:在对应的web文件中添加以下代码:<filter>    <filter-name>httpHeaderSecurity</filter-na...
    99+
    2024-04-02
  • beego如何防止sql注入
    beego框架里的Raw函数使用了占位符,并且beego是经过mysql的数据库驱动封装打包后再传到mysql中的,这个过程中已经实现了防止SQL注入,因此不再存在SQL注入的危险。...
    99+
    2024-04-02
  • ajax如何防止sql注入
    ajax防止sql注入的方法:将以下代码放在公用的js里面即可,如:$.ajaxSetup({contentType: "application/x-www-form-urlencoded;charset=utf-8",beforeSend...
    99+
    2024-04-02
  • hql如何防止sql注入
    hql防止sql注入的方法:在HQL语句中定义命名参数要用”:”开头,例如:Query query=session.createQuery(“from User user where user.name=:customername...
    99+
    2024-04-02
  • spring如何防止sql注入
    spring防止sql注入的方法:可以通过编写一个webFilter过滤器来防止sql注入,例如:@Component@WebFilter(urlPatterns = ")|" +"(\\b(select|update|and|or|del...
    99+
    2024-04-02
  • nginx如何防止sql注入
    nginx防止sql注入的方法:对于提交后台的所有数据都进行过滤转义。数据库中的用户密码需加密存放。php程序进行二次过滤,过滤GET和POST变量中的关键字。生产环境关闭PHP和MySQL的错误信息。一般问号后面的请求参数,在nginx用...
    99+
    2024-04-02
  • tp5如何防止sql注入
    tp5防止sql注入的方法:在application/config.php中设置全局的过滤规则,如:// 默认全局过滤方法 用逗号分隔多个'default_filter' => 'htmlspecialchars,addslashes,st...
    99+
    2024-04-02
  • net如何防止sql注入
    net防止sql注入的方法:在直接处理SQL语句时,将传递的值进行参数化,然后在进行赋值,例如:cmd.CommandText = @"select count(*) from UserInfo where UserNa...
    99+
    2024-04-02
  • druid如何防止sql注入
    druid防止sql注入的方法:采用druid数据连接池添加防sql注入配置,例如:<bean id="dataSource" class="com.alibaba.druid.poo...
    99+
    2024-04-02
  • laravel如何防止sql注入
    laravel防止sql注入的方法:当你使用Eloquent查询时,如:User::where('name', $input_name)->first();因为Eloquent 内部使用的是PDO参数绑定,所以你的请求是安全的,使...
    99+
    2024-04-02
  • ef如何防止sql注入
    ef防止sql注入的示例:ef作为一个orm框架,本身放置了sql的注入,例如查询视图"select * from VM where 条件 = {0}"时的方法:function bool&...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作