精华内容
下载资源
问答
  • 如何避免sql注入
    千次阅读
    2022-01-12 10:41:56

    sql注入是web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息、利用数据库的特性执行添加用户、导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。

    造成sql注入的原因:

    程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL脚本,程序在接收后错误的将攻击者的输入作为SQL语句的一部分执行,导致原始的查询逻辑被改变,执行了攻击者精心构造的恶意SQL语句。

    如从用户表根据用户名admin和密码123查用户信息

    select * from User where username = 'admin' and password = '123'

    攻击者恶意修改用户名参数 admin-->xxxx or 1=1 --

    select * from user where username = 'xxxx' or 1=1 --and password = '123'

    SQL中--是注释标记,如果上面这个SQL被执行,就可以让攻击者在不知道任何用户名和密码的情况下成功登录。所以,防止sql注入至关重要

    预防sql注入方法:

    • 严格限制Web应用的数据库的操作权限,给连接数据库的用户提供满足需要的最低权限,最大限度的减少注入攻击对数据库的危害
    • 对进入数据库的特殊字符进行转义处理,或编码转换
    • 校验参数的数据格式是否合法(可以使用正则或特殊字符的判断)
    • 预编译SQL (Java中使用PreparedStatement),参数化查询方式,避免SQL拼接
    • 使用mybatis的"#{}“预编译,将传入的值按照字符串的形式进行处理
    • 发布前,利用工具进行SQL注入检测
    • 报错信息不要包含SQL信息输出到 Web 页面
    更多相关内容
  • 如何避免SQL注入(一文弄懂SQL注入与其解决办法)一,SQL注入:1. 是什么2. 语句3. 如何解决二,PreparedStatement1. 什么是动态提供参数2. 对比PreparedStatement与Statement3. 实例展示 最近学习到了SQL注入,也...

    最近学习到了SQL注入,也就是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎,最终达到欺骗服务器执行恶意的SQL命令。那么如何解决这个问题呢,下面博主对自己的学习结果进行总结与大家分享。

    一,SQL注入:

    1. 是什么

    就是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎,最终达到欺骗服务器执行恶意的SQL命令。

    它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

    2. 语句

    假如现在登录账号:admin; 密码:abc

    一般正常的,在Java中写SQL语句的方式如下:

    String sql="select * from users where  username= 'admin'  and password= 'abc'";
    

    而在SQL注入恶意的SQL语句如下:

    String username ="admin";
    String password="  ' ' or 1=1 ";
    String sql="select * from users where  username= '"+username+"'  and password="+password;
    

    解释:通过这样写,数据库执行时就会理解为:

    String sql="select * from users where username= 'admin'  and password=  " or 1=1;
    

    在数据库语句中,where后面使用or满足其一即可,很显然1=1是正确的,那么这样就能做到在不知晓账号和密码的前提下仍可以执行。

    3. 如何解决

    如何解决SQL注入呢,那么就不得不提到PreparedStatement(预状态通道)了。

    二,PreparedStatement

    PreparedStatement(预状态通道)是Statement(状态通道)接口的扩展,所有它同样是接口,用法和Statement一模一样。只是预状态通道的功能更强大,它可以实现动态的提供参数;

    预状态通道通过实现动态提供参数来解决SQL注入问题。

    1. 什么是动态提供参数

    动态提供参数就是:参数先换成?,后面再把?换成具体值的过程;

    1. 把JDBC中的所有参数都由 ? 符号代替,? 被称为占位符或者参数标记。在执行SQL语句之前,必须为每个占位符提供具体值。

    2. setXXX()方法将值绑定到所述参数,其中XXX代表要绑定到输入参数的值的Java数据类型。如果忘记提供值,将收到一个SQLException。

    3. 每个参数标记由其顺序位置引用。第一个标记表示位置1,下一个位置2等等。该方法与Java数组索引不同,从0开始。具体看下面实例。

    2. 对比PreparedStatement与Statement

    1. statement属于状态通道,PreparedStatement属于预状态通道
    2. 预状态通道会先编译sql语句,再去执行,比statement执行效率高。而statement是执行的时候才去编译SQL语句。
    3. 预状态通道支持占位符?,给占位符赋值的时候,位置从1开始
    4. 预状态通道可以防止sql注入的原因:预状态通道对每个值都是以字符串的形式处理。

    关于statement状态通道在博主前面文章有大量实例,可以参考:《JDBC
    如何在Java中操作数据库(实例演示,看不懂我背锅)》

    3. 实例展示

    /**
     * 预处理通道
     */
    public class demo3 {
        public static void main(String[] args) {
            Connection connection = null;
            PreparedStatement pps = null;
            ResultSet resultSet = null;
    
            try {
                //1. 加载驱动
                Class.forName("com.mysql.cj.jdbc.Driver");
                //2. 获得连接
                String userName="root";
                String passWord="314156";
                String url="jdbc:mysql://localhost:3306/mysql1?serverTimezone=UTC";
                connection = DriverManager.getConnection(url, userName, passWord);
                //3. 定义SQL,创建预状态通道(进行SQL语句的发送)
                String sql = "select * from stu where username=? and password=?";
                pps = connection.prepareStatement(sql);
                String uname = "admin";
                String pass = "abc"
                // 给占位符赋值(下标,内容)从1开始
                pps.setString(1,sname);
                pps.setString(2,pass);
                //执行SQL
                resultSet =pps.executeQuery();
                //4. 取出结果信息
                if(resultSet.next()){
                    System.out.println("登录成功");
                }else{
                    System.out.println("登录失败");
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (resultSet != null) {
                        resultSet.close();
                    }
                    if (pps != null) {
                        pps.close();
                    }
                    if (pps != null) {
                        pps.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    最后输出结果:

    image-20211203164224045

    展开全文
  • Java-如何避免SQL注入漏洞

    千次阅读 2022-01-02 10:13:40
    采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX(如:setString)方法传值即可。 好处: (1).代码的可读性和可维护性变好。 (2).PreparedStatement尽最大可能提高性能。 (3).最重要的一点是极大...

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net

    1、简单又有效的方法是使用PreparedStatement
    采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX(如:setString)方法传值即可。
    好处:
    (1).代码的可读性和可维护性变好。
    (2).PreparedStatement尽最大可能提高性能。
    (3).最重要的一点是极大地提高了安全性。
    原理:
    SQL注入只对SQL语句的编译过程有破坏作用,而PreparedStatement的SQL语句编译阶段已经准备好了,执行阶段只是把输入串作为数据处理,而不再对SQL语句进行解析、准备,因此也就避免了SQL注入问题。
    一些热门ORM框架在处理SQL时候也都使用了PreparedStatement,比如MyBatis。
    我们在使用MyBatis要注意:在注入参数值得时候使用#{xxx},#{xxx}已经启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。
    “${xxx}”这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。
    有时有些操作要使用这种方式,比如传入表,模糊匹配等。这时可以使用bind+#{}防止SQL注入(#{}进行预编译,传递的参数不进行编译,只作为参数,相当于PreparedStatement)。
    bind元素可以从OGNL表达式中创建一个变量并将其绑定到上下文。比如:

    <select id="selectBlog" resultType="Blog">
    <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
    SELECT * FROM BLOG WHERE title LIKE #{pattern}
    </select>

    2、使用过滤器
    如果我们做不到所有的SQL语句都使用PreparedStatement,我们可以使用过滤器,进行全局的拦截这些字符串。在过滤器中,使用正则表达式过滤传入的参数。使用正则表达式,判断是否匹配:

    String begin="您的请求参数信息";
    
    //可以通过配置文件,去配置这些特殊字符,以便随时添加一些关键字。
    String pattern="|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like";
    
    Pattern r = Pattern.compile(pattern);
    Matcher isMatch = r.matcher(begin);
    if(isMatch.find()){
        //危险请求参数
    }
    展开全文
  • 如何避免 sql 注入

    万次阅读 多人点赞 2019-07-04 10:04:24
    如何避免 sql 注入? 1、概念 SQL 注入SQL Injection),是 Web 开发中最常见的一种安全漏洞。 可以用它来从数据库获取敏感信息、利用数据库的特性执行添加用户、导出文件等一系列恶意操作,甚至有可能获取...

    如何避免 sql 注入?

    1、概念

    SQL 注入(SQL Injection),是 Web 开发中最常见的一种安全漏洞。

    可以用它来从数据库获取敏感信息、利用数据库的特性执行添加用户、导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。

     

    2、造成 SQL 注入的原因 

    程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的 SQL 脚本,程序在接收后错误的将攻击者的输入作为 SQL 语句的一部分执行,导致原始的查询逻辑被改变,执行了攻击者精心构造的恶意 SQL 语句。

     

    如 从用户表根据用户名 ConstXiong 和密码 123 查用户信息

    select * from user where username = 'ConstXiong' and password = '123'

    恶意修改用户名参数 ConstXiong -> ConstXiong' or 1=1 --

    select * from user where username = 'ConstXiong' or 1=1 --' and password = '123'

    SQL 中 -- 是注释标记,如果上面这个 SQL 被执行,就可以让攻击者在不知道任何用户名和密码的情况下成功登录。

     

    3、预防 SQL 注入攻击的方法

    • 严格限制 Web 应用的数据库的操作权限,给连接数据库的用户提供满足需要的最低权限,最大限度的减少注入攻击对数据库的危害
    • 校验参数的数据格式是否合法(可以使用正则或特殊字符的判断)
    • 对进入数据库的特殊字符进行转义处理,或编码转换
    • 预编译 SQL(Java 中使用 PreparedStatement),参数化查询方式,避免 SQL 拼接
    • 发布前,利用工具进行 SQL 注入检测
    • 报错信息不要包含 SQL 信息输出到 Web 页面

     

    参考:避免 SQL 注入

     


    【Java面试题与答案】整理推荐

     

    展开全文
  • golang避免SQL注入

    千次阅读 2021-02-10 07:03:35
    而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者...
  • SQL 注入SQL Injection)是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句...
  • 导致SQL注入的原因是?如何解决? 导致SQL注入的根本原因是:用户不是一般的用户,用户是懂的程序的,输入的用户信息以及密码信息 中含有SQL语句的关键字,这个SQL语句的关键字和底层的SQL语句进行“字符创的...
  • 防止sql注入工具类l

    2019-03-22 02:50:07
    NULL 博文链接:https://kaka100.iteye.com/blog/1004594
  • 对于B/S系统,SQL注入攻击就是一个常见的安全隐患,下面我们来看下如何在日常开发中避免SQL注入攻击。SQL注入简介 SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好...
  • oracle参数查询避免SQL注入

    千次阅读 2017-08-18 17:00:36
    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力...
  • PageHelper的order by方法可替代mybatis中order by必须使用$来避免sql注入 ** 在my batis中,我们通常使用#{字符}来传值。在mybatis中使用order by排序时也习惯性的使用#,然后发现sql错误,后来研究才发现在order ...
  • SQL注入攻击与防御

    2018-07-17 15:29:47
    另外,《SQL注入攻击与防御》还专门从代码层和系统层的角度介绍了避免SQL注入的各种策略和需要考虑的问题。 《SQL注入攻击与防御》主要内容: SQL注入一直长期存在,但最近有所增强。《SQL注入攻击与防御》包含所有...
  • 一、什么叫SQL注入攻击?sql注入简介 SQL注入是较为普遍的互联网攻击方法,它并不是通过电脑操作系统的BUG来完成攻击,而是对于程序编写时的疏漏,利用SQL语句,达到无帐号登录,乃至改动数据库的目的。 SQL注入...
  • 如何防止SQL注入

    千次阅读 2020-12-21 16:20:30
    一、如何防止SQL注入?...理论上,只要避免数据项中存在引号、分号等特殊字符就能很大程度上避免SQL注入的发生。 另外,就是使用各类程序文档所推荐的数据库操作方式来执行数据项的查询与写入操作,首先使用execute()
  • 避免SQL注入三大方法

    千次阅读 热门讨论 2014-05-19 20:24:13
    具体的原理到底是怎么回事儿,查了些资料好像涉及到了编译原理,也没能够看明白,只是视频中讲到了这三种方法是经常用来避免SQL注入最常用的方法,于是查些资料希望能对现学的知识有一定的了解。下面是对这三种方法...
  • Hibernate如何避免sql注入攻击

    千次阅读 2012-08-02 21:15:44
    如果在查询字段中输入单引号"'",则会报错,这是因为输入的单引号和其他的sql组合在一起编程了一个新的sql,实际上这就是SQL注入漏洞,后来我在前台和后台都对输入的字符进行了判断。   永远也不要写这样的代码:...
  • 文章目录注入SQL注入JDBC拼接不当造成SQL注入框架使用不当造成SQL注入不安全的反射命令注入代码注入表达式注入Spel表达式注入OGNL表达式注入模板注入 注入 SQL注入 JDBC拼接不当造成SQL注入 JDBC有两种方法执行SQL...
  • mybatis如何防止SQL注入

    千次阅读 2022-05-17 22:54:10
    sql注入发生的时间,sql注入发生的阶段在sql预编译阶段,当编译完成的sql不会产生sql注入 一、采用jdbc操作数据时候 String sql = "update ft_proposal set id = "+id; PreparedStatement prepareStatement = conn....
  • MyBatis防止SQL注入的方法

    千次阅读 2022-01-06 11:09:38
    MyBatis防止SQL注入方法 文章目录MyBatis防止SQL注入方法1. 前言2. 示例3. 不用MyBatis防止SQL注入的方法4. 原理5. 参考链接 1. 前言     这个问题其实就是问MyBatis中的#{}和KaTeX parse error...
  • 什么是sql注入?如何避免?

    千次阅读 2021-05-30 19:39:54
    什么是SQL注入SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全...
  • SQL注入是什么,怎么防止SQL注入

    千次阅读 2021-07-29 09:14:42
    SQL注入是什么,怎么防止SQL注入? 一、什么是SQL注入SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。 ...
  • Mybatis和Hibernate:防止SQL注入

    万次阅读 2019-01-29 10:49:58
    SQL注入是目前黑客最常用的攻击手段,它的原理是利用数据库对特殊标识符的解析强行从页面向后台传入。改变SQL语句结构,达到扩展权限、创建高等级用户、强行修改用户资料等等操作。 为什么这么说,下面就以JAVA为...
  • 有效防止SQL注入的5种方法总结

    千次阅读 2021-03-22 12:55:23
    sql注入入门SQL 注入是一类危害极大的攻击形式。虽然危害很大,但是防御却远远没有XSS那么困难。SQL 注入漏洞存在的原因,就是拼接 SQL 参数。也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入...
  • SpringBoot项目防止Sql注入

    千次阅读 2022-03-01 11:20:01
    由于我们的项目遭受了一次sql注入攻击,被批评的头破血流,马不停蹄安排起来。 首先,了解一下@WebFilter注解 @WebFilter 用于将一个类声明为过滤器,被@WebFilter注解的类,会在容器启动时被加载,并进行...
  • SQL注入攻击如何防止

    千次阅读 2020-09-21 17:48:02
    目录SQL注入攻击如何防止什么是SQL注入攻击不安全代码编写攻击方式如何防止sql注入代码层其他方法最后 SQL注入攻击如何防止 ​ SQL注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,由于...
  • JDBC连接如何防止SQL注入

    千次阅读 2020-10-07 17:10:48
    1. 绪言 想要学习mybatis的相关知识...操作数据库实现增删改查:获取statement,执行SQL语句,处理执行结果 简单的连接和查询示例如下: import java.sql.*; public class Test { private static final String DR
  • mysql如何防止sql注入

    千次阅读 2022-01-26 16:10:11
    如果是mybatis框架,使用#{参数}设置参数,不要用${参数} 为什么mybatis中的#{} 为什么能防止sql注入,${}不能防止sql注入,PreparedStatement能防止sql注入呢? #{}在mybatis中的底层是运用了PreparedStatement 预...
  • PDO预处理防御SQL注入

    千次阅读 2022-04-06 21:14:50
    PDO可以被认作是一种通过编译SQL语句模板来运行SQL语句的机制。 查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,...
  • SQL注入

    2020-12-14 17:22:12
    SQL注入 什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 304,716
精华内容 121,886
关键字:

如何避免sql注入