`
stanxl
  • 浏览: 4393 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Statement的注入问题浅谈

 
阅读更多

前天有人问我说,我知道用Statement可能会产生注入问题,但是啥是注入问题?其实我知道他了解过,但是现在忘记了…..
谁说不是呢,我也是有些遗忘了,我就知道如果在sql语句后直接拼接条件,是可能产生注入问题 ,当然了如果你设置的条件是你想要,肯定不会出现注入问题的
话不多说,既然说到了注入问题,就去看看这个传说中的“注入问题”….
先让问题暴露出来,看下面的代码:
现在是这样,假设现在我的库里的数据是这样的:
1 黄药师 1900-1-1 400
2 黄晓明 1920-1-1 800

public class StatementTest{
    public static void create(){
        Connection con = null;
        Statement st = null;
        try{
            con = //加载驱动,获得连接;
            st = con.createStatement();
            String sql = "insert into users(name, birthday, money) values('周伯通', '1900-1-1', 300)";
            st.execute(sql);
            System.out.println("存入成功!");
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //释放资源,调用close()
        }
        public static void read(String uid){
            Connection con = null;
            Statement st = null;
            ResultSet rs = null;
            try{
                con = //加载驱动,获得连接;
                st = con.createStatement();
                String sql = "select * from users where uid =" + uid;
                st.execute(sql);
                rs = st.getResultSet();
                while(rs.next()){
                    System.out.print(rs.getObject(1) + "\t");
                    System.out.print(rs.getObject(2) + "\t");
                    System.out.print(rs.getObject(3) + "\t");
                    System.out.print(rs.getObject(4) + "\t");
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                //释放资源,调用close()
            }
        }
    }
    public static void main(String[] args){
        create();
        read("1 or 1 < 2");
    }   
}

这个时候,查询到的结果是全部:

1 黄药师 1900-1-1 400
2 黄晓明 1920-1-1 800
3 周伯通 1900-1-1 300

可以看出,传入的参数中,包含了sql代码! 这个代码会让条件失效!
解决方法:以后再也不要使用Statement了。取而代之使用java.sql.PreparedStatement!

public static void read(String uid){
            Connection con = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try{
                con = //加载驱动,获得连接;
                // 通过数据库连接,获得预处理语句对象!
                // 预处理语句对象和Statement对象的作用很像,但是用法有区别.
                // 预处理语句中可以出现占位符,用?代表一个占位
                // 在执行sql语句之前,必须把所有的占位符替换成真正的值!

                String sql = "select * from users where uid = ?";
                ps = con.prepareStatement(sql);
                ps.setString(1,Integer.parseInt("uid"));
                ps.executeQuery();
                rs = ps.getResultSet();
                while(rs.next()){
                    System.out.print(rs.getObject(1) + "\t");
                    System.out.print(rs.getObject(2) + "\t");
                    System.out.print(rs.getObject(3) + "\t");
                    System.out.print(rs.getObject(4) + "\t");
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                //释放资源,调用close()
            }
        }

再在main方法里调用 read(“1 or 1 < 2”)时,就会报错了,通过PrepareStatement预处理语句,将不合理的条件过滤掉,解决了注入问题。
所以以后就把createStatement舍弃吧,也尽量不要在sql语句后面直接拼接条件。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    如何解决sql注入问题

    ### 如何解决SQL注入问题:全面解析与防范策略 #### SQL注入概述 SQL注入是一种常见的安全漏洞,攻击者通过在应用程序的输入字段中插入恶意SQL语句,利用这些语句来操控数据库,获取未授权的数据访问,修改或破坏...

    prepareStatement和Statement的区别

    prepareStatement和Statement的区别 prepareStatement和Statement是 Java 中两个常用的数据库操作接口,它们都可以用来执行 SQL 语句,但是它们之间有着明显的区别。 首先,从创建时的区别开始,Statement 需要...

    Statement Tracer for Oracle

    2. **性能指标**:Statement Tracer提供详细的性能指标,如执行时间、调用次数、缓冲区命中率等,这些指标有助于定位性能问题的关键点。 3. **计划分析**:通过显示执行计划,工具可以帮助用户理解查询如何在数据库...

    Statement和PreparedStatement之间的区别

    在 Statement 对象中,如果用户输入的数据包含恶意代码,例如 Drop 表名,可能会导致数据库安全问题。而PreparedStatement对象则可以避免这种情况,因为它将用户输入的数据作为参数传入,而不是将其直接嵌入到SQL...

    Java-JDBC【源码】JDBC概述、获取连接、SQL注入问题与解决、查询解析

    4.创建`Statement` (此处存在SQL注入问题) 5.执行SQL 6.解析查询对象`ResultSet` 7.关闭连接 `ResultSet 、Statement 、Connection` 3.SQL注入问题与解决(Statement 、PreparedStatement) 3.1.模拟SQL注入 3.2....

    HSBC-Bank-statement_statement_template_

    hsbc statement template

    statement-tracer-for-oracle

    当遇到数据库性能问题时,Statement Tracer可以提供详细的诊断报告,包括慢查询列表、锁等待、事务状态等,帮助快速定位问题根源。 6. 优化建议: 针对捕获的SQL语句,Statement Tracer可能还会给出优化建议,...

    sql注入讲解ppt.pptx

    2. Prepared Statement:使用 Prepared Statement 来防止 SQL 注入攻击。 3. LIMIT 和 OFFSET:使用 LIMIT 和 OFFSET 限制查询结果,防止敏感数据泄露。 4.Least Privilege:使用最小权限原则,限制数据库用户的权限...

    Statement Tracer for Oracle,oracle代码跟踪工具

    "Statement Tracer for Oracle"是一个专门针对Oracle数据库的代码跟踪工具,它帮助开发者和DBA深入分析SQL语句的执行情况,从而提高数据库性能和解决问题。 Statement Tracer for Oracle的主要功能包括: 1. **...

    statement和prepared区别

    而使用Statement时,SQL注入是一个常见的安全漏洞,因为直接将外部输入拼接到SQL语句中,容易被恶意用户利用。 其次,PreparedStatement有助于提升代码的可读性和可维护性。当SQL语句中带有多个参数时,使用...

    Statement Tracer for ADO

    在实际应用中,Statement Tracer for ADO可以帮助我们解决以下问题: - **调试复杂逻辑**:当数据库操作隐藏在多层函数调用中时,通过追踪SQL语句,我们可以快速定位问题所在。 - **性能瓶颈查找**:通过查看执行...

    sql注入之数字型注入

    2. Prepared Statement:使用 Prepared Statement 来防止恶意输入。 3. 参数化查询:使用参数化查询来防止恶意输入。 4. 输入过滤:对用户输入进行过滤,防止恶意输入。 5. 数据库权限控制:对数据库权限进行控制,...

    statement_tracer_for_oracle

    在Oracle数据库管理中,"statement_tracer_for_oracle"是一个重要的工具,主要用于追踪SQL语句的执行情况,以便于在程序运行时收集信息并进行问题分析。这个工具可以帮助数据库管理员和开发人员深入理解数据库的运行...

    java防止SQL注入

    Java 防止 SQL 注入是一个至关重要的安全问题,SQL 注入攻击是最常见的攻击方式之一,它不是利用操作系统或其他系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了 SQL 的空子。因此,在系统开发...

    sql注入的思维导图。

    * Prepared Statement:使用预编译语句来防止SQL注入。 * Web应用程序防火墙:使用WAF来防御SQL注入。 常见问题 SQL注入中常见的问题包括: * bp抓包时不能用127.0.0.1 * 多种方式注入最好不用延时注入 * 使用...

    引入mybatis-plus报 Invalid bound statement错误问题的解决方法

    "引入mybatis-plus报Invalid bound statement错误问题的解决方法" Mybatis-Plus是一个基于Mybatis的增强工具,旨在简化开发效率。然而,在使用Mybatis-Plus时,可能会遇到各种问题,例如Invalid bound statement...

    Java防止SQL注入的几个途径

    如果使用 PreparedStatement 来代替 Statement 来执行 SQL 语句,其后只是输入参数,SQL 注入攻击手段将无效。这是因为 PreparedStatement 不允许在不同的插入时间改变查询的逻辑结构,大部分的 SQL 注入已经挡住了...

Global site tag (gtag.js) - Google Analytics