序,目前在对数据库进行操作之前,使用prepareStatement预编译,然后再根据通配符进行数据填值,是比较常见的做法,好处是提高执行效率,而且保证排除SQL注入漏洞。

一、prepareStatement的预编译和防止SQL注入功能

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

​ 用法就是如下边所示:

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

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

二、Statement和PreparedStatement的区别

先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。具体步骤:

1.首先导入java.sql.*;这个包。

2.然后加载驱动,创建连接,得到Connection接口的的实现对象,比如对象名叫做conn。

3.然后再用conn对象去创建Statement的实例,方法是:Statement stmt = conn.creatStatement(“SQL语句字符串”);

Statement 对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL语句的包容器:Statement、PreparedStatement(它从 Statement 继承而来)和CallableStatement(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句:Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存储过程的调用。

综上所述,总结如下:Statement每次执行sql语句,数据库都要执行sql语句的编译,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement.但存在sql注入风险。PreparedStatement是预编译执行的。在执行可变参数的一条SQL时,PreparedStatement要比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率高。安全性更好,有效防止SQL注入的问题。对于多次重复执行的语句,使用Prepared

Statement效率会更高一点。执行SQL语句是可以带参数的,并支持批量执行SQL。由于采用了Cache机制,则预编译的语句,就会放在Cache中,下次执行相同的SQL语句时,则可以直接从Cache中取出来。

PreparedStatement pstmt  =  con.prepareStatement("UPDATE EMPLOYEES  SET name= ? WHERE ID = ?");
pstmt.setString(1, "李四");
pstmt.setInt(2, 1);
pstmt. executeUpdate();

那么CallableStatement扩展了PreparedStatement的接口,用来调用存储过程,它提供了对于输入和输出参数的支持,CallableStatement 接口还有对 PreparedStatement 接口提供的输入参数的sql查询的支持。

PreparedStatement: 数据库会对sql语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率(但尽量采用使用?号的方式传递参数),如果sql语句只执行一次,以后不再复用。 从安全性上来看,PreparedStatement是通过?来传递参数的,避免了拼sql而出现sql注入的问题,所以安全性较好。

在开发中,推荐使用 PreparedStatement

三、什么是SQL注入,怎么防止SQL注入?

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

怎么防止SQL注入,使用存储过程来执行所有的查询;检查用户输入的合法性;将用户的登录名、密码等数据加密保存。

四、spring中的事务是如何配置的?Spring中的AOP实现是基于什么原理?

先来回答第二个问题,是个开发者都知道Spring中的AOP说的是面向切面的编程。所以,再深入点,AOP的实现原理其实是Java的动态代理

第二个问题,先来说说数据库中的事务,再来说所Spring是怎么处理数据库中的事务的。通俗的说,数据库事务就是在你需要插入1000条数据,然后再修改其中5条,删除其中3条的操作执行完毕之后的一次性提交。而在提交之前,这些变动实际上不写入数据库的。同时,里面如果有一步出错的话,所有的在这一个事务内部做过的变动都要撤销、回滚。如果未使用事务的话,对于上述操作,实际上数据库操作的次数是100+5+3次。那么,Spring对事务做了一些什么事情呢?Spring对事务做了封装,可以通过申明的方式提供事务管理,

预处理prepareStatement是怎么防止sql注入漏洞的?相关推荐

  1. SQL 注入漏洞详解

    [渗透测试实用手册]SQL注入漏洞 漏洞名称 SQL注入漏洞 漏洞地址 漏洞等级 高危 漏洞描述 SQL 注入漏洞是指攻击者通过把恶意的 SQL 语句插入到网站的输入参数中,来绕过网站的安全措施,获取 ...

  2. thinkphp日志泄漏漏洞_ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法...

    ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件 根据官方文档对"防止SQL注入" ...

  3. 测试php框架漏洞,ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法...

    作者: seay 下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑.建议类似的厂商不要再 ...

  4. JDBC的SQL注入漏洞分析和解决

    SQL注入漏洞分析 SQL注入漏洞解决 需要采用PreparedStatement对象解决SQL注入漏洞.这个对象将SQL预先进行编译,使用?作为占位符.?所代表内容是SQL所固定.再次传入变量(包含 ...

  5. SQL注入漏洞解决方法

    本文只指针编码层次的SQL注入漏洞解决方法,例子代码是以java为主. 1,参数化的预编译查询语句 不安全例子 String query = "SELECT account_balance ...

  6. JDBC的SQL注入漏洞

    1.概念: 利用sql语句的漏洞来对系统进行攻击,导致数据泄露 2.案例演示 数据库登录表: 模拟登录代码[输入正确的用户名和密码才能打印出用户信息] public class SQL注入 {publ ...

  7. /plus/recommend.php sql注入漏洞,代码审计:ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法 | Seay 渗透 编程 代码审计 网络安全博客...

    显示不全请点击全屏阅读 下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑.建议类似的厂商 ...

  8. sql注入漏洞与如何解决

    关于sql注入漏洞 这个问题说白了其实很简单,就是因为sql语句使用拼接字符串导致的 举例 String sql="SELECT * FROM userdata WHERE user=&qu ...

  9. 浅析Java代码审计中的SQL注入漏洞

    浅析Java代码审计中的SQL注入漏洞 1.注入漏洞简介 2.SQL注入漏洞简介 3.JDBC拼接不当造成SQL注入 第一关:使用Statement 第二关:使用PrepareStatement 4. ...

最新文章

  1. 二分查找(递归与非递归)
  2. mAP@.5 含义:
  3. CV之Image Caption:Image Caption算法的相关论文、设计思路、关键步骤相关配图之详细攻略
  4. DE1-LINUX运行
  5. JavaScript new对象的四个过程
  6. 常见面试题思想方法整理
  7. 张亚勤称云计算进入2.0时代,百度首推端云一体化芯片,开放110+AI能力
  8. SweynTooth:这些蓝牙漏洞导致多种设备易受攻击
  9. CCNA3.0中文版教材
  10. iwconfig 中 Link Quality and Signal Level 区别
  11. 一年级前一学期计算机应用题,计算机教学工作计划7篇
  12. javaweb基于内容的图片搜索(2)_java爬虫
  13. Handlebars的使用方法及技巧
  14. 计算机中ar的作用,AR增强现实是什么意思?
  15. 这可能是网贷历史上最黑夜的一个月
  16. java项目生成manifest_使用Maven生成manifest
  17. 微信小程序获取数据库的数据返回空数组
  18. [SAP ABAP开发技术总结]屏幕跳转
  19. android contacts电话查询头像,Androidの通过查询电话号码或ID获取联系人头像
  20. mysql 闪回删除记录_mysql5.7 闪回数据(update delete insert)

热门文章

  1. [转载] Python 递归 深入理解递归 Python递归剖析,绝对让你看懂!
  2. c语言指针++_C ++此指针| 查找输出程序| 套装1
  3. ruby array_在Ruby中使用Array.pop和Array.shift方法从Array中删除元素
  4. mysql 5.6 5.7不兼容_同一条sql在mysql5.6和5.7版本遇到的问题。
  5. Python读写ini文件的封装类
  6. Pytorch torchvision完成Faster-rcnn目标检测demo及源码详解
  7. Vue + Element UI 实现 登陆注册基本demo实例
  8. 复习---使用基础语法实现栈及迭代
  9. ssh 脚本 空格字符转换
  10. std::make_unique和 std::make_shared区别