之所以PreparedStatement能防止注入,是因为它把单引号转义了,变成了\',这样一来,就无法截断SQL语句,进而无法拼接SQL语句,基本上没有办法注入了。

不使用这个,我们一般做查询或更新的条件,是用字符串拼起来的,例如

1
2
String id = (String)request.getAttribute("id");    //假设页面上传了一个id值过来
String SQL = "SELECT ID,NAME FROM USER WHERE ID='" + id + "'";    //拼接成一个完整的sql语句

但是这样带来了一个风险,因为id是界面上客户输入的,所以如果没有进入校验,有人输入了一个aa' or '1'='1  把这个值代入到上面的sql语句里面,sql语句就变成了

1
SELECT ID,NAME FROM USER WHERE ID='aa' or '1'='1'

这样就能查到所有的数据了,也就是SQL注入

但是,如果用preparedstatement的话,就没有这个问题

1
String SQL = "SELECT ID,NAME FROM USER WHERE ID=?"

然后再将值set进去,如果值里面有引号等字符时,会自动的启用转义,不会破坏这个SQL语句的结果,也就不会造成SQL注入了

大家都知道,Java中JDBC中,有个预处理功能,这个功能一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入。

用法就是如下边所示:

  1. String sql="update cz_zj_directpayment dp"+
  2. "set dp.projectid = ? where dp.payid= ?";
  3. try {
  4. PreparedStatement pset_f = conn.prepareStatement(sql);
  5. pset_f.setString(1,inds[j]);
  6. pset_f.setString(2,id);
  7. pset_f.executeUpdate(sql_update);
  8. }catch(Exception e){
  9. //e.printStackTrace();
  10. logger.error(e.message());
  11. }

那为什么它这样处理就能预防SQL注入提高安全性呢?其实是因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了SQL注入的作用了!

preparestatement可以避免注入的更多相关文章

  1. MySQL_(Java)使用preparestatement解决SQL注入的问题

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL数据库中的数据,数据库名garysql,表名gar ...

  2. MyBatis是如何解决Sql注入的

    转:[转]mybatis如何防止sql注入 java中预处理PrepareStatement为什么能起到防止SQL注入的作用??!! 一.SQL注入 sql注入大家都不陌生,是一种常见的攻击方式,攻击 ...

  3. statement 、prepareStatement的用法和解释

    转自:http://blog.csdn.net/QH_JAVA/article/details/48245945   一.prepareStatement 的用法和解释 1.PreparedState ...

  4. PreparedStatement 防止sql注入 练习

    使用的数据库 MariaDB 10.5.4版本   端口1054     数据库为jt_db,表 为user 数据库的建表和插入相关数据代码: create table user( id int pr ...

  5. (2018干货系列一)最新Java学习路线整合

    怎么学Java Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. 话不多说,直接上干货: ...

  6. 6.12-PrepareStatement,JdbcUtil 读取数据库配置文件properties,dao模式

    一.PrepareStatement 防止sql注入 PrepareStatement 是预编译sql语句 更加灵活,更有效率 executeUpdate() 做增删改 executeQuery() ...

  7. jdbc学习笔记02

    数据库连接池 DBCP DataBase Conection Pool:数据库连接池 如果没有数据库连接池,每一次业务都需要服务器和数据库服务器建立一次连接,业务处理完连接断开,如果有1万次业务处理, ...

  8. JDBC 学习笔记(六)—— PreparedStatement

    1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...

  9. JAVASSM框架面试题

    1.SpringMVC的工作流程? 1. 用户发送请求至前端控制器DispatcherServlet 2. DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3 ...

随机推荐

  1. JS组件系列——表格组件神器:bootstrap table(二:父子表和行列调序)

    前言:上篇 JS组件系列——表格组件神器:bootstrap table 简单介绍了下Bootstrap Table的基础用法,没想到讨论还挺热烈的.有园友在评论中提到了父子表的用法,今天就结合Boo ...

  2. ASP.NET中的缓存机制

    ASP.NET 提供一个功能完整的缓存引擎,页面可使用该引擎通过 HTTP 请求存储和检索任意对象.缓存的生存期与应用程序的生存期相同,也就是说,当应用程序重新启动时,将重新创建缓存. 将数据添加到缓 ...

  3. 纯CSS实现图片水平垂直居中于DIV(图片未知宽高)

    <div class="demo"><a href="#"><img src="http://nec.netease.c ...

  4. qq菜单的折叠与展示

    敲出每个小例子是一种进步 html结构: <body> <ul id="list"> <li class="lis"> &l ...

  5. 大图居中,以1920px为例

    <div style="overflow: hidden; position: relative;"> <img src="img.jpg" ...

  6. 黄聪:phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护

    首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把class ...

  7. Android基础总结(一)

    Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包,导入此包方可使用 ...

  8. 动态树之LCT(link-cut tree)讲解

    动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作.其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT( ...

  9. 配置maven

    http://www.cnblogs.com/liunanjava/archive/2015/11/05/4936037.html

  10. 【原】用css让一个容器水平垂直

    这种css布局平时用的比较多,也是面试题常出的一个题,网上一搜一大丢,不过还是想自己总结一下. 这种方法比较多,本文只总结其中的几种,以便加深印象. 效果图都为这个: 方法一:position加mar ...