java 最新sql注入原因以及预防方案(易理解)
前沿
在现有的框架中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注入原因以及预防方案(易理解)相关推荐
- SQL注入原理及预防SQL注入的方法
网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,担心网上的信息以及个人隐私遭到泄露.下面要为大家介绍的是SQL注入,对于sql注入,相信程序员都知道或者使用过,如果没有了解或完全没有听 ...
- java 防止sql注入_Java中SQL注入以及如何轻松防止它
java 防止sql注入 什么是SQL注入? (What is SQL Injection?) SQL Injection is one of the top 10 web application v ...
- Java 防SQL注入方法
在前面的博客中,我们详细介绍了: sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决 ...
- PHP防SQL注入代码,PHP 预防CSRF、XSS、SQL注入攻击
1.服务端进行CSRF防御 服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数. (1).Cookie Hashing(所有表单都包含同一个伪随机值): 这可能是最简单 ...
- java防止sql注入方正_有效防止SQL注入的5种方法总结
sql注入入门 SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQ ...
- SQL注入问题及预防方法
SQL注入问题 sql存在漏洞,会被攻击导致数据泄露 SQL会被拼接 or package com.kuang.lesson02; import com.kuang.lesson02.utils.jd ...
- MySQL for Java的SQL注入测试
2019独角兽企业重金招聘Python工程师标准>>> 只要你学JDBC,基本上所有的人都会和你说,Statement不能防止SQL注入, PreparedStatement能够防止 ...
- java 防止sql注入的方法(非原创)
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注 ...
- 齐博cms最新SQL注入网站漏洞 可远程执行代码提权
齐博cms整站系统,是目前建站系统用的较多的一款CMS系统,开源,免费,第三方扩展化,界面可视化的操作,使用简单,便于新手使用和第二次开发,受到许多站长们的喜欢.开发架构使用的是php语言以及mysq ...
最新文章
- 浏览器输入「xxxxhub」的背后.....
- 回车键兼容多个浏览器
- 行业软件和鸿蒙,华为鸿蒙负责人王成录:育人才,打造国产软件“根”能力
- AspNetPager7.2的基本使用
- 一文梳理JavaScript中常见的七大继承方案
- python网络编程---TCP服务器
- DWR2学习笔记(一)
- ArcEngine中加载ArcGIS Server地图服务
- android 仿美团悬浮,类似美团悬浮框的效果
- 计算机网络中的ttl怎么理解,Ping值中“TTL”是什么意思,为什么使用“TTL”这个概念?...
- 用计算机来猜星座,[转]实用推荐---三个问题猜出对方的星座
- 数列求和-加强版(C语言)
- 使用navicat导入SQL语句的教程
- mysql必知必会第5版pdf_sql必知必会
- 2023-04-03 Linux中杀死进程kill和killall命令的区别,着重介绍killall
- 当今程序员很厉害?不!那是你不了解上古时期的那些神级操作
- 按键精灵:函数之可选参数
- 用聚合数据API快速写出小程序(苏州实时公交)
- 中科蓝汛----指示灯配置使用方法
- win10无法识别linux硬盘,win10硬盘不能识别怎么办_win10硬盘不能识别解决办法_飞翔教程...
热门文章
- java 多线程状态_总结Java中线程的状态及多线程的实现方式
- java校验文件格式_Java 判断文件是否为文本格式,并获取文件编码格式,读取内容!...
- 怎样将两个html页面合并,如何把WORD的两个页面合并在一起?
- Java黑皮书课后题第2章:2.15(几何:两点间距离)编写程序,提示用户输入两个点(x1,y1)和(x2,y2),显示两点距离
- python的rsa公钥解密方法
- matlab球面波衍射,单色点源矩孔菲涅耳衍射光场的计算与模拟
- 2修改字段名_DevExpress ASP.NET v18.2新功能详解(二)
- [C/C++基础知识] 一篇就让你彻底搞懂qsort快速排序的文章
- Swift之深入解析如何避免单元测试中的强制解析
- OpenGL ES之GLSL实现仿抖音“分屏滤镜”效果