热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:如何有效防止sql注入的方法

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

sql注入攻击是黑客对%ignore_a_1%进行攻击常用的手段之一,随着b/s模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想获取的数据,这就是所谓的sql injection,即sql注入。

一 背景

假如某高校开发了一个网课系统,要求学生选课后完成学习,数据库中有一张表course,这张表存放着每个学生的选课信息及完成情况,具体设计如下:

如何有效防止sql注入的方法

数据如下:

如何有效防止sql注入的方法

本系统采用mysql做为数据库,使用jdbc来进行数据库的相关操作。系统提供了一个功能查询该学生的课程完成情况,代码如下。

  @restcontroller  public class controller {            @autowired      sqlinject sqlinject;            @getmapping("list")      public list courselist(@requestparam("studentid") string studentid){          list orders = sqlinject.orderlist(studentid);          return orders;      }  }

  @service  public class sqlinject {        @autowired      private jdbctemplate jdbctemplate;            public list 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 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 = 0) {                  return true;              }          }          return false;      }  }

到此这篇关于如何有效防止sql注入的方法的文章就介绍到这了,更多相关sql防止注入内容请搜索<编程笔记>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<编程笔记>!

需要了解更多数据库技术:如何有效防止sql注入的方法,都可以关注数据库技术分享栏目—编程笔记


推荐阅读
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文详细介绍了如何处理Oracle数据库中的ORA-00227错误,即控制文件中检测到损坏块的问题,并提供了具体的解决方案。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 在AngularJS中,有时需要在表单内包含某些控件,但又不希望这些控件导致表单变为脏状态。例如,当用户对表单进行修改后,表单的$dirty属性将变为true,触发保存对话框。然而,对于一些导航或辅助功能控件,我们可能并不希望它们触发这种行为。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • Redis: 高效的键值存储系统
    Redis是一款遵循BSD许可的开源高性能键值存储系统,它不仅支持多种数据类型的存储,还提供了数据持久化和复制等功能,显著区别于其他键值缓存解决方案。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • 宝塔面板下启用HTTPS的详细指南
    本文提供了在宝塔面板环境中配置HTTPS的具体步骤,确保您的网站通信更加安全可靠。 ... [详细]
  • 本文介绍如何通过mysqladmin ext命令监控MySQL数据库的运行状态,包括性能指标的实时查看和分析。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
author-avatar
直由飞翔_447
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有