iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java最新的SQL注入原因以及预防方案
  • 722
分享到

Java最新的SQL注入原因以及预防方案

2023-06-15 19:06:16 722人浏览 八月长安
摘要

这篇文章主要讲解了“Java最新的sql注入原因以及预防方案”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java最新的SQL注入原因以及预防方案”吧! 前沿在现有的框架中sql防

这篇文章主要讲解了“Java最新的sql注入原因以及预防方案”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java最新的SQL注入原因以及预防方案”吧!

 前沿

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

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

SQL注入

1.1 原理

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

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  是成立的。因此验证就会被跳过。这只是一个简单的例子,

2 案例2

密码比如是这样的:'; drop table user;, 这样的话,那么sql命令就变成了:

select * from user where username = '' and password = ''; drop table user;',  那么这个时候我们会把user表直接删除了。

1.3 防范

1 前端

前端表单进行参数格式控制;

2 后端

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

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

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

  • java中的验证字符串是否包含sql的判断

package cn.javanode.thread;  import java.util.regex.Pattern;   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注入的?

拼接参数(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

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是把整个参数用引号包起来,并把参数中的引号作为转义字符,从而避免了参数也作为条件的一部分

源码分析

结论

  • preparedStatement.setString 会判断当前参数的符号是否需要转义,是的话加的转义符

  • 如果不需要,则直接加上引号

Java最新的SQL注入原因以及预防方案

//完整代码 public void setString(int parameterIndex, String x) throws SQLException {        synchronized (checkClosed().getConnectionMutex()) {            // if the passed string is null, then set this column to null            if (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 encoding                            parameterAsBytes = 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 encoding                            parameterAsBytes = StringUtils.getBytes(x);                        }                         setBytes(parameterIndex, parameterAsBytes);                    }                     return;                }

感谢各位的阅读,以上就是“Java最新的SQL注入原因以及预防方案”的内容了,经过本文的学习后,相信大家对Java最新的SQL注入原因以及预防方案这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java最新的SQL注入原因以及预防方案

本文链接: https://www.lsjlt.com/news/281346.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java最新的SQL注入原因以及预防方案
    这篇文章主要讲解了“Java最新的SQL注入原因以及预防方案”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java最新的SQL注入原因以及预防方案”吧! 前沿在现有的框架中sql防...
    99+
    2023-06-15
  • Java OOM原因以及解决方案
    1)什么是OOM? OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。看下关于的官方说明...
    99+
    2024-04-02
  • 基于spring注入为null的原因及解决方案
    目录spring注入为null场景经检查找出原因解决方法@PostConstruct:Spring注入的属性为null可能的情况保证Bean能够交付给Spring容器检查实例化的方式...
    99+
    2024-04-02
  • SQL注入的实现以及防范示例详解
    什么是SQL注入 SQL注入是指通过构建特殊的输入篡改原来的SQL语句达到攻击者所需的操作。 Sql 注入产生原因 我们访问动态网页时往往会向服务器发送请求,服务器向数据访问层发...
    99+
    2024-04-02
  • SQL参数化查询能防止SQL注入的原因是什么
    这篇文章主要介绍了SQL参数化查询能防止SQL注入的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL参数化查询能防止SQL注入的原因是什么文章都会有所收获,下面我...
    99+
    2023-03-20
    sql
  • Vue.$set失效的原因以及解决方案
    这篇文章主要讲解了“Vue.$set失效的原因以及解决方案”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue.$set失效的原因以及解决方案”吧!偶然在项目中发现Vue.$set失效有这样...
    99+
    2023-06-20
  • java防止sql注入的方法有哪些
    java防止sql注入的方法有:采用PreparedStatement进行预编译,sql语句在执行的过程中效率比Statement要高,例如:String sql = "select* from users wher&#...
    99+
    2024-04-02
  • 阿里云ECS总是断连接原因、解决方案及预防措施
    阿里云ECS(Elastic ComputeService)是阿里云提供的计算服务,用户可以通过阿里云ECS创建和管理虚拟服务器,实现弹性计算。然而,有些用户反映阿里云ECS总是断连接,严重影响了他们的业务运营。那么,阿里云ECS总是断连接...
    99+
    2023-12-16
    预防措施 阿里 解决方案
  • java防止sql注入的方式有哪些
    Java防止SQL注入的方式有以下几种:1. 使用参数化查询(Prepared Statement):使用PreparedState...
    99+
    2023-08-23
    java sql
  • 阿里云数据库备案错误原因、解决方法及预防措施
    阿里云数据库作为阿里云旗下的一款云计算产品,受到了广大用户的欢迎。然而,在使用过程中,有些用户可能会遇到本地连接阿里云数据库备案错误的问题。本文将详细解析该问题的原因,并提供相应的解决方法,同时也会提出一些预防措施,以确保用户能够正常使用阿...
    99+
    2023-12-10
    预防措施 阿里 解决方法
  • Java项目防止SQL注入的方式总结
    目录 一、什么是SQL注入? 二、Java项目防止SQL注入方式 1、PreparedStatement防止SQL注入 2、mybatis中#{}防止SQL注入 3、对请求参数的敏感词汇进行过滤 4、nginx反向代理防止SQL注入 ...
    99+
    2023-09-03
    java nginx mybatis
  • 简单聊聊SQL注入的原理以及一般步骤
    目录原理一般利用步骤1.判断注入点2.判断查询字段数3.查数据库名、版本号、用户名等信息4.查询表名5.查询字段名6.查询记录内容总结原理 SQL注入是一种攻击方式,在这种攻击方式中...
    99+
    2024-04-02
  • java file.renameTo返回false的原因及解决方案
    java file.renameTo返回false原因 需要对文件夹下的文件重命名,发现返回false了,先用main方法测试,发现没问题,如下 public static vo...
    99+
    2024-04-02
  • 阿里云链接MySQL数据库错误原因、解决方案及预防措施
    阿里云链接MySQL数据库时经常会出现错误,这可能是由于多种原因引起的,如网络问题、数据库服务器故障、数据库权限问题等。本文将对这些问题进行详细的分析,并提供相应的解决方案,希望能帮助用户解决在阿里云链接MySQL数据库时遇到的问题。 一、...
    99+
    2023-12-18
    预防措施 阿里 解决方案
  • 重启阿里云MySQL数据库错误原因、解决方案及预防措施
    在使用阿里云MySQL数据库的过程中,可能会遇到各种问题,其中重启数据库就是一个常见的问题。本文将详细探讨重启阿里云MySQL数据库时可能出现的错误,分析其原因,并提供相应的解决方案。此外,我们还将探讨一些预防此类问题的措施。 在使用阿里云...
    99+
    2023-12-11
    预防措施 阿里 重启
  • 阿里云备案绑定服务器失败原因、解决方法及预防措施
    本文主要针对阿里云备案绑定服务器失败的问题进行深入的分析和解答。我们将从原因、解决方法以及预防措施三个方面进行详细阐述,帮助读者解决在阿里云备案绑定服务器过程中遇到的问题。 阿里云备案绑定服务器失败的原因主要有以下几点:网络问题:网络不稳定...
    99+
    2023-11-12
    预防措施 阿里 解决方法
  • 阿里云新服务器SSH链接失败原因、解决方案与预防措施
    在使用阿里云新服务器时,有时可能会遇到SSH链接失败的问题,这可能是由于许多因素引起的。本文将分析这个问题的原因,提供解决方案,并提供一些预防措施,帮助您避免此类问题。 一、问题分析账号密码错误:在使用SSH链接时,输入的账号和密码可能错误...
    99+
    2023-10-28
    预防措施 阿里 解决方案
  • 阿里云服务器未续费数据异常原因、解决方案及预防措施
    本文主要讲解了阿里云服务器未续费数据异常的情况,包括了其原因、解决方案以及预防措施。阿里云服务器未续费数据异常可能会导致数据丢失,影响业务的正常运行,因此了解其原因并采取有效的预防措施是非常重要的。 阿里云服务器未续费数据异常的原因:服务器...
    99+
    2023-12-14
    预防措施 阿里 续费
  • 数据库之SQL注入原理以及过程的简单介绍
    1、产生SQL注入原因 开发代码的时候没有全面考虑到网络安全性,特别是在用户交互时,没有考虑到用户提交的信息中可能破坏数据库,没有对输入的数据进行合法的过滤。SQL 注入过程目的性是...
    99+
    2024-04-02
  • Java项目防止SQL注入的几种方法总结
    目录一、什么是SQL注入?二、Java项目防止SQL注入方式1、PreparedStatement防止SQL注入2、mybatis中#{}防止SQL注入3、对请求参数的敏感词汇进行过...
    99+
    2023-05-16
    java防止SQL注入 java防sql注入代码 java sql注入
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作