1.关于SQL注入

什么是SQL注入:

由于jdbc程序在执行的过程中sql语句在拼装时使用了由页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句意义发生变化,这种攻击方式就叫做sql注入,参考用户注册登录案例。

首先看一下以下代码:

  1. String sql = "select* from users where username='" + userName
  2. + "' and password='" + passWord+"'";
  3. Connection conn = null;
  4. Statement state = null;
  5. ResultSet result;
  6. conn = JdbcUtil.getConnection();
  7. System.out.println(sql);
  8. try {
  9. state = conn.createStatement();
  10. result = state.executeQuery(sql);

这是一段根据传入用户名,密码查找用户表的代码。

在做用户登录的验证的时候,我们可能会根据用户所填写的用户名和密码在后台拼成一条SQL语句执行,去查用户表:

select* from users where username='张三' and password='小张',如果能查出结果则表示验证成功,允许登录,否则账号或密码错误不允许登录。那么在组成这条语句的过程中会存在一个叫做SQL注入的问题,就是用户在输入用户名或密码的时候填写某些内容使得后台所拼成的SQL语句语义有所变化。

举个例子,在没有防止SQL的情况下:假如我们知道一个用户叫做张三,但是不知道这个用户的密码是什么,我们依然可以在登录的时候在用户输入框写上:张三'# 然后密码框任意填:njksad。一点击登录,会发现居然能够登录上去。那是为什么呢?

这是因为#在SQL中的意思是注释,那么我们根据上面的情况来分析一下最终所拼成的SQL语句是怎样的,

select* from users where username='张三'#' and password='njksad'

为了让大家能够看清楚上面那条SQL语句,笔者特地加大显示,可以看到  username='张三' 之后是一个#

那就意味着之后的内容都是注释,也就是可以忽略掉那么这条语句真正发挥作用的部分就是:select* from users where username='张三'

直接变成了一条查找张三 的语句,完全不用经过密码验证。

2.防止SQL注入攻击

那么怎么才能做到防止SQL注入攻击呢?

在上面那段代码中,Statement的对象是用来执行SQL语句的,Statement有一个子类叫做PreparedStatement,可以做到防止SQL注入攻击,接下来我们来看看PreparedStatement有什么特点以及怎么使用:

PreparedStatement是Statement的孩子,不同的是,PreparedStatement使用预编译机制,在创建PreparedStatement对象时就需要将sql语句传入,传入的过程中参数要用?替代,这个过程回导致传入的sql被进行预编译,然后再调用PreparedStatement的setXXX将参数设置上去,由于sql语句已经经过了预编译,再传入特殊值也不会起作用了。
而且PreparedStatement使用了预编译机制,sql语句在执行的过程中效率比Statement要高。

    1. String sql = "select* from users where username=? and password=?";
    2. Connection conn = null;
    3. PreparedStatement state = null;
    4. ResultSet result;
    5. conn = JdbcUtil.getConnection();
    6. System.out.println(sql);
    7. try {
    8. state = conn.prepareStatement(sql);
    9. state.setString(1, userName);
    10. state.setString(2, passWord);
    11. result = state.executeQuery();

关于SQL注入的问题以及解决方法的更多相关文章

  1. 需要我们了解的SQL Server阻塞原因与解决方法

    需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...

  2. SQL注入9种绕过WAF方法

    SQL注入9种绕过WAF方法 0x01前言 WAF区别于常规 防火墙 是因为WAF能够过滤特定Web应用程序的内容,而常规防火墙则充当服务器之间的防御门.通过检查HTTP的流量,它可以防御Web应用安 ...

  3. MySQL数据库”mysql SQL Error:1146,SQLState:42S02 “解决方法

    项目在开发的时候在Mac平台下开发的,开发完了之后在LINUX环境上部署好之后,运行时MySQL数据库报错,提示为某个表不存在之类的错误信息,后来修改了MySQL的配置文件将大小写敏感去掉,问题解决. ...

  4. 在Springmvc普通类@Autowired注入request为null解决方法

    在Springmvc普通类@Autowired注入request为null解决方法   在类中加入以下注入request对象的代码,运行时发现request为null,注入失败.在@Controlle ...

  5. PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决

    这篇是上一篇 http://www.cnblogs.com/charlesblc/p/5987951.html 的续集. 看有的文章提到mysqli和PDO都支持多重查询,所以下面的url会造成表数据 ...

  6. Java学习笔记47(JDBC、SQL注入攻击原理以及解决)

    JDBC:java的数据库连接 JDBC本质是一套API,由开发公司定义的类和接口 这里使用mysql驱动,是一套类库,实现了接口 驱动程序类库,实现接口重写方法,由驱动程序操作数据库 JDBC操作步 ...

  7. 【SpringBoot】拦截器使用@Autowired注入接口为null解决方法

    最近使用SpringBoot的自定义拦截器,在拦截器中注入了一个DAO,准备下面作相应操作,拦截器代码: public class TokenInterceptor implements Handle ...

  8. BCP SQL导出EXCEL常见问题及解决方法;数据导出存储过程

    一.‘xp_cmdshell’的启用 SQL Server阻止了对组件‘xp_cmdshell’的过程‘sys.xp_cmdshell’的访问.因为此组件已作为此服务嚣安全配置的一部分而被关 闭.系统 ...

  9. mybatis项目报错:java.sql.SQLException: ORA-00911: 无效字符 解决方法

    如果你用java写程序访问数据库,出现这个问题:java.sql.SQLException: ORA-00911: 无效字符 at oracle.jdbc.driver.DatabaseError.t ...

随机推荐

  1. Ubuntu下软件打开时状态图标与原始图标不重合问题解决

    问题描述 如下图书所示,pycharm打开时,运行的pycharm图标与原始的在收藏夹中的图标不重合.而其他软件不会这样,运行软件的图标与原始图标会重合, 解决办法 把鼠标悬浮在打开的pycharm上 ...

  2. JVM 之类加载器

    一.什么是 JVM JVM(Java Virtual Machine)是一个可以执行 Java 字节码文件(即 .class 文件)的虚拟机进程.当 Java 源文件能被成功编译成 .class 文件 ...

  3. ElasticSearch实战系列四: ElasticSearch理论知识介绍

    前言 在前几篇关于ElasticSearch的文章中,简单的讲了下有关ElasticSearch的一些使用,这篇文章讲一下有关 ElasticSearch的一些理论知识以及自己的一些见解. 虽然本人是 ...

  4. mysql导入导出数据,备份,恢复数据

    MYSQL 实现导入数据 .备份和恢复数据库 1.使用msql命令导入数据 # mysql -uroot -p 需要选择一个数据库 < runoob.sql #mysql -u username ...

  5. java程序员面试宝典1

    1.在java中字符串只以Unicode一种形式存在(不选择任何特定的编码,直接使用他们在字符集中的编号,这是统一的唯一的方法) 2.在java中,是指在JVM中,在内存中,在你的代码里声明的每个ch ...

  6. 剑指offer-2:斐波那契数列

    二.斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 1.递归法 1). 分析 斐波那契数列的标准公式为 ...

  7. js 学习三 Array

    1.数组的长度 var sequence = [1, 1, 2, 3, 5, 8, 13]; sequence .length //7 2.字符串转换成数组 string.split() var my ...

  8. AIX 6.1创建逻辑卷并挂载【smitty】

    1.创建卷组 #mkvg  -y   datavg     hdisk2   hdisk3   #smitty   vg

  9. 解决CRMEasy新建咨询不能保存问题

    系统时间必须为24H制 将12H制修改为24H制的方法:(XP系统) 控制面板---区域和语言选项----区域选项-----自定义---时间----时间格式为:HH:mm:ss-----确定

  10. tar/gzip/zip文件打包、压缩命令

    一.tar打包备份工具 1.命令功能 tar 将多个文件或目录打包在一起,可用通过调用gzip或zip实现压缩.解压的命令:tar不仅可以多多个文件进行打包,还可以对多个文件打包后进行压缩. 2.语法 ...