sql注入发生的时间,sql注入发生的阶段在sql预编译阶段,当编译完成的sql不会产生sql注入

采用jdbc操作数据时候

String sql = "update ft_proposal set id = "+id;
PreparedStatement prepareStatement = conn.prepareStatement(sql);
prepareStatement.executeUpdate();

preparedStatement 预编译对象会对传入sql进行预编译,那么当传入id 字符串为  "update  ft_proposal set id = 3;drop table ft_proposal;"   这种情况下就会导致sql注入删除ft_proposal这张表。

如何防止sql注入,首先将要执行sql进行预编译,然后在将占位符进行替换

String sql = "update ft_proposal set id = ?"
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1,"2");
ps.executeUpdate();

处理使用预编译语句之外,另一种实现方式可以采用存储过程,存储过程其实也是预编译的,存储过程是sql语句的集合,将所有预编译的sql 语句编译完成后,存储在数据库上,

由于存储过程比较死板一般不采用这种方式进行处理。

二、mybatis是如何处理sql注入的?

假设mapper.xml文件中sql查询语句为:

<select id="findById" resultType="String">
select name from user where id = #{userid};
</select>

对应的接口为:

public String findById(@param("userId")String userId);

当传入的参数为3;drop table user; 当我们执行时可以看见打印的sql语句为:

select name from usre where id = ?;

不管输入何种参数时,都可以防止sql注入,因为mybatis底层实现了预编译,底层通过prepareStatement预编译实现类对当前传入的sql进行了预编译,这样就可以防止sql注入了。

如果将查询语句改写为:

<select id="findById" resultType = "String">
select name from user where id=${userid}
</select>

当输入参数为3;drop table user;  执行sql语句为

select name from user where id = 3;drop table user ;

mybatis没有进行预编译语句,它先进行了字符串拼接,然后进行了预编译。这个过程就是sql注入生效的过程。

因此在编写mybatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。

mybatis是如何防止sql注入?的更多相关文章

  1. mybatis是如何防止SQL注入的

    mybatis是如何防止SQL注入的 1.首先看一下下面两个sql语句的区别: <select id="selectByNameAndPassword" parameterT ...

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

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

  3. mybatis模糊查询防止SQL注入

    SQL注入,大家都不陌生,是一种常见的攻击方式.攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序.所以,在我们的应用 ...

  4. SQL注入和Mybatis预编译防止SQL注入

    什么是SQL注入?? 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或页面请求url的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命 ...

  5. MyBatis 模糊查询 防止Sql注入

    #{xxx},使用的是PreparedStatement,会有类型转换,所以比较安全: ${xxx},使用字符串拼接,可以SQL注入: like查询不小心会有漏洞,正确写法如下:   Mysql:   ...

  6. mybatis中#{}与${}的差别(如何防止sql注入)

    默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义. # ...

  7. 简单说说mybatis是防止SQL注入的原理

    mybatis是如何防止SQL注入的 1.首先看一下下面两个sql语句的区别: <select id="selectByNameAndPassword" parameterT ...

  8. 10年前,我就用 SQL注入漏洞黑了学校网站

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  9. 什么是sql注入?如何有效防止sql注入?

    一.什么是sql注入 利用程序员的代码bug,将输入的参数绕过校验并在系统中当做代码运行,从而攻击系统. 二.如何避免sql注入 1.对sql语句进行预编译 PreparedStatement类可以对 ...

随机推荐

  1. HTTPS与SSL(一)

    1.  HTTPS HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版 ...

  2. NC57访问报错:java.sql.SQLException: Io 异常: Got minus one from a read call

    一.报错信息 1.  前端登录界面 2.  后台应用日志 报错信息一致为: $$callid= $$thread=[Service Monitor and Runtime Enroment] $$ho ...

  3. WPF中的StackPanel、WrapPanel、DockPanel(转)

    一.StackPanel StackPanel是以堆叠的方式显示其中的控件 1.可以使用Orientation属性更改堆叠的顺序 Orientation="Vertical" 默认 ...

  4. es6 随笔

    记录一些学习es6中学习的新特性,挺有用,作为日后复习es6用,便于记忆. 1.变量定义let和const es6用let.const代替,let是定义块级作用域中的变量,const声明之后必须赋值, ...

  5. JavaScript-判断语句(if...else)

    语法: if(条件) { 条件成立时执行的代码 } else { 条件不成立时执行的代码 } 假设我们通过年龄来判断是否为成年人,如年龄大于等于18岁,是成年人,否则不是成年人.代码表示如下: < ...

  6. 【BZOJ4650】[NOI2016] 优秀的拆分(后缀数组)

    点此看题面 大致题意: 定义将一个字符串拆成\(AABB\)的形式为优秀拆分,求一个字符串所有子串的优秀拆分个数. 后缀数组 这题可是一道后缀数组黑题啊. 其实看完题解这题还是挺简单的. 大致思路 显 ...

  7. Tarjan在图论中的应用(一)——用Tarjan来实现强连通分量缩点

    前言 \(Tarjan\)是一个著名的将强连通分量缩点的算法. 大致思路 它的大致思路就是在图上每个联通块中任意选一个点开始进行\(Tarjan\)操作(依据:强连通分量中的点可以两两到达,因此从任意 ...

  8. 如何从github上拉取项目中的指定目录

    2010开始,对于GitHub上的每一个Git版本库,现在都可以用SVN命令进行操作,而svn命令则是支持部分检出的. 方法如下: 例如我想下载我的nginxinc/kubernetes-ingres ...

  9. 第17题:打印1到最大的n位数

    面试题17:打印1到最大的n位数  题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 考点: 用字符串或者数组表达一个大数. 思路 1. ...

  10. cf540D. Bad Luck Island(概率dp)

    题意 岛上有三个物种:剪刀$s$.石头$r$.布$p$ 其中剪刀能干掉布,布能干掉石头,石头能干掉剪刀 每天会从这三个物种中发生一场战争(也就是说其中的一个会被干掉) 问最后仅有$s/r/p$物种生存 ...