前沿

在现有的框架中sql防注入已经做得很好了,我们需要做的就是尽量不要使用sql拼接调用

java sql注入原因以及预防方案(易理解)

1. SQL注入

1.1 原理

SQL注入是通过客户端的输入把SQL命令注入到一个应用的数据库中,从而执行恶意的SQL语句。

1.2 演示

1.2.1 案例1

有一个登录框,需要输入用户名和密码,然后我们的密码输入 'or ‘123’ = '123 这样的。我们在查询用户名和密码是否正确的时候,本来执行的sql语句是:select * from user where username = ‘’ and password = ‘’. 这样的sql语句,现在我们输入密码是如上这样的,然后我们会通过参数进行拼接,拼接后的sql语句就是:

select * from user where username = ‘’ and password = ’ ’ or ‘123’ = '123 '; 这样的了,那么会有一个or语句,只要这两个有一个是正确的话,就条件成立,因此 123 = 123 是成立的。因此验证就会被跳过。这只是一个简单的列子,

1.2.2 案例2

密码比如是这样的:’; drop table user;, 这样的话,那么sql命令就变成了:
select * from user where username = ‘’ and password = ‘’; drop table user;’ , 那么这个时候我们会把user表直接删除了。

1.3 防范

1.3.1 前端
  • 前端表单进行参数格式控制;
1.3.2 后端
  • 我们可以使用预编译语句(PreparedStatement,这 样的话即使我们使用sql语句伪造成参数,到了服务端的时候,这个伪造sql语句的参数也只是简单的字符,并不能起到攻击的作用。

  • 使用正则表达式过滤传入的参数

注意: 永远也不要把未经检查的用户输入的值直接传给数据库

  • java中的验证字符串是否包含sql的判断
package cn.javanode.thread;import java.util.regex.Pattern;/*** @author xgt(小光头)* @version 1.0* @date 2021-1-8 11:48*/
public class CheckSqlDemo {/**正则表达式**/private static String reg = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|"+ "(\\b(select|update|union|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";private static Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);private static boolean isValid(String str) {if (sqlPattern.matcher(str).find()){System.out.println("未能通过过滤器:str=" + str);return false;}return true;}public static void main(String[] args) {System.out.println(isValid("tongji_user_add"));}}

补充

PreparedStatement是如何防止SQL注入的?

1. 拼接参数(sql注入)

     Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);PreparedStatement preparedStatement = connection.prepareStatement(sql);       String param = "'test' or 1=1";String sql = "select file from file where name = " + param; // 拼接SQL参数ResultSet resultSet = preparedStatement.executeQuery();System.out.println(resultSet.next());

输出结果为true,DB中执行的SQL为

-- 永真条件1=1成为了查询条件的一部分,可以返回所有数据,造成了SQL注入问题
select file from file where name = 'test' or 1=1

2. setString (防注入)

     Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);PreparedStatement preparedStatement = connection.prepareStatement(sql);   preparedStatement.setString(1,account);//设置参数preparedStatement.setString(2,password);ResultSet resultSet = preparedStatement.executeQuery();//执行查询sql,获取结果集

输出结果为false,DB中执行的SQL为

select file from file where name = '\'test\' or 1=1'

我们可以看到输出的SQL是把整个参数用引号包起来,并把参数中的引号作为转义字符,从而避免了参数也作为条件的一部分

3. 源码分析

结论

  • preparedStatement.setString 会判断当前参数的符号是否需要转义,是的话加的转义符
  • 如果不需要,则直接加上引号

//完整代码
public void setString(int parameterIndex, String x) throws SQLException {synchronized (checkClosed().getConnectionMutex()) {// if the passed string is null, then set this column to nullif (x == null) {setNull(parameterIndex, Types.CHAR);} else {checkClosed();int stringLength = x.length();if (this.connection.isNoBackslashEscapesSet()) {// Scan for any nasty chars// 判断是否需要转义boolean needsHexEscape = isEscapeNeededForString(x, stringLength);if (!needsHexEscape) {byte[] parameterAsBytes = null;StringBuilder quotedString = new StringBuilder(x.length() + 2);quotedString.append('\'');quotedString.append(x);quotedString.append('\'');if (!this.isLoadDataQuery) {parameterAsBytes = StringUtils.getBytes(quotedString.toString(), this.charConverter, this.charEncoding,this.connection.getServerCharset(), this.connection.parserKnowsUnicode(), getExceptionInterceptor());} else {// Send with platform character encodingparameterAsBytes = StringUtils.getBytes(quotedString.toString());}setInternal(parameterIndex, parameterAsBytes);} else {byte[] parameterAsBytes = null;if (!this.isLoadDataQuery) {parameterAsBytes = StringUtils.getBytes(x, this.charConverter, this.charEncoding, this.connection.getServerCharset(),this.connection.parserKnowsUnicode(), getExceptionInterceptor());} else {// Send with platform character encodingparameterAsBytes = StringUtils.getBytes(x);}setBytes(parameterIndex, parameterAsBytes);}return;}

java 最新sql注入原因以及预防方案(易理解)相关推荐

  1. SQL注入原理及预防SQL注入的方法

    网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,担心网上的信息以及个人隐私遭到泄露.下面要为大家介绍的是SQL注入,对于sql注入,相信程序员都知道或者使用过,如果没有了解或完全没有听 ...

  2. java 防止sql注入_Java中SQL注入以及如何轻松防止它

    java 防止sql注入 什么是SQL注入? (What is SQL Injection?) SQL Injection is one of the top 10 web application v ...

  3. Java 防SQL注入方法

    在前面的博客中,我们详细介绍了: sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决 ...

  4. PHP防SQL注入代码,PHP 预防CSRF、XSS、SQL注入攻击

    1.服务端进行CSRF防御 服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数. (1).Cookie Hashing(所有表单都包含同一个伪随机值): 这可能是最简单 ...

  5. java防止sql注入方正_有效防止SQL注入的5种方法总结

    sql注入入门 SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQ ...

  6. SQL注入问题及预防方法

    SQL注入问题 sql存在漏洞,会被攻击导致数据泄露 SQL会被拼接 or package com.kuang.lesson02; import com.kuang.lesson02.utils.jd ...

  7. MySQL for Java的SQL注入测试

    2019独角兽企业重金招聘Python工程师标准>>> 只要你学JDBC,基本上所有的人都会和你说,Statement不能防止SQL注入, PreparedStatement能够防止 ...

  8. java 防止sql注入的方法(非原创)

    一.SQL注入简介       SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注 ...

  9. 齐博cms最新SQL注入网站漏洞 可远程执行代码提权

    齐博cms整站系统,是目前建站系统用的较多的一款CMS系统,开源,免费,第三方扩展化,界面可视化的操作,使用简单,便于新手使用和第二次开发,受到许多站长们的喜欢.开发架构使用的是php语言以及mysq ...

最新文章

  1. 浏览器输入「xxxxhub」的背后.....
  2. 回车键兼容多个浏览器
  3. 行业软件和鸿蒙,华为鸿蒙负责人王成录:育人才,打造国产软件“根”能力
  4. AspNetPager7.2的基本使用
  5. 一文梳理JavaScript中常见的七大继承方案
  6. python网络编程---TCP服务器
  7. DWR2学习笔记(一)
  8. ArcEngine中加载ArcGIS Server地图服务
  9. android 仿美团悬浮,类似美团悬浮框的效果
  10. 计算机网络中的ttl怎么理解,Ping值中“TTL”是什么意思,为什么使用“TTL”这个概念?...
  11. 用计算机来猜星座,[转]实用推荐---三个问题猜出对方的星座
  12. 数列求和-加强版(C语言)
  13. 使用navicat导入SQL语句的教程
  14. mysql必知必会第5版pdf_sql必知必会
  15. 2023-04-03 Linux中杀死进程kill和killall命令的区别,着重介绍killall
  16. 当今程序员很厉害?不!那是你不了解上古时期的那些神级操作
  17. 按键精灵:函数之可选参数
  18. 用聚合数据API快速写出小程序(苏州实时公交)
  19. 中科蓝汛----指示灯配置使用方法
  20. win10无法识别linux硬盘,win10硬盘不能识别怎么办_win10硬盘不能识别解决办法_飞翔教程...

热门文章

  1. java 多线程状态_总结Java中线程的状态及多线程的实现方式
  2. java校验文件格式_Java 判断文件是否为文本格式,并获取文件编码格式,读取内容!...
  3. 怎样将两个html页面合并,如何把WORD的两个页面合并在一起?
  4. Java黑皮书课后题第2章:2.15(几何:两点间距离)编写程序,提示用户输入两个点(x1,y1)和(x2,y2),显示两点距离
  5. python的rsa公钥解密方法
  6. matlab球面波衍射,单色点源矩孔菲涅耳衍射光场的计算与模拟
  7. 2修改字段名_DevExpress ASP.NET v18.2新功能详解(二)
  8. [C/C++基础知识] 一篇就让你彻底搞懂qsort快速排序的文章
  9. Swift之深入解析如何避免单元测试中的强制解析
  10. OpenGL ES之GLSL实现仿抖音“分屏滤镜”效果