• 从Java角度修复SQL注入漏洞


       很多情况因为过滤不严导致很多网站存在sql注入,这里以用户登陆为例,简单举例

           首先创建一个测试的数据库

            比较基础,不写创建过程了

            

          java代码如下:

            

    package cn.basic.jdbc;
    
    import java.awt.image.RescaleOp;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import org.junit.jupiter.api.Test;
    
    public class Test1 {
        /*
         * public static void main(String[] args) throws ClassNotFoundException,
         * SQLException { login("aa","aa"); }
         */
        @Test
        public void testlogin() throws ClassNotFoundException, SQLException {
            login("aa", "aa");
        }
    
        public static void login(String username, String password) throws SQLException, ClassNotFoundException {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "root");
            Statement st = conn.createStatement();
            String sql = "select * from xxx where username=" + "'" + username + "'" + "and password=" + "'" + password
                    + "'";
            ResultSet rs = st.executeQuery(sql);
            if (rs.next()) {
                System.out.println("恭喜" + username + "登陆成功");
                System.out.println(sql);
            } else {
                System.out.println("登录失败");
            }
            if (rs != null) {
                rs.close();
            }
    
            /*
             * if (st != null) { st.close(); }
             */
            if (conn != null) {
                conn.close();
            }
        }
    
    }

      

          运行

          

    输入正确账号密码可以登陆成功。这里可以被绕过。

        

    很显然这是万能密码。那么如何去修复sql注入呢,这里比较好的方法是采用预编译的开发方式,这是个开发习惯问题。

        修复后的预编译代码如下:

          

    package cn.basic.jdbc;
    
    import java.awt.image.RescaleOp;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import org.junit.jupiter.api.Test;
    
    public class Test1 {
        /*
         * public static void main(String[] args) throws ClassNotFoundException,
         * SQLException { login("aa","aa"); }
         */
        @Test
        public void testlogin() throws ClassNotFoundException, SQLException {
            login("aa", "aa");
        }
    
        public static void login(String username, String password) throws SQLException, ClassNotFoundException {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "root");
            String sql="select * from xxx where username=? and password=?";
            //使用预编译
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, username);
            ps.setString(2, password);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                System.out.println("恭喜" + username + "登陆成功");
                System.out.println(sql);
            } else {
                System.out.println("登录失败");
            }
            if (rs != null) {
                rs.close();
            }
            if(ps!=null) {
                ps.close();
            }
    
            /*
             * if (st != null) { st.close(); }
             */
            if (conn != null) {
                conn.close();
            }
        }
    
    }

        再来测试下是否存在安全漏洞:

            输入正确密码:

          

    尝试万能密码绕过:

        

    这里杜绝了sql注入的产生,在很多时候,要养成用预编译编方式实现增删改查,这里以查询为例子,增删改同理!

        预编译并不代表百分百防止sql注入的,这只是一种防止sql注入的措施。

            不忘初心,方得始终。

          

              

  • 相关阅读:
    HDOJ 1202 The calculation of GPA
    HDOJ 1197 Specialized Four-Digit Numbers
    HDOJ 1196 Lowest Bit(二进制相关的简单题)
    HDOJ 1194 Beat the Spread!(简单题)
    NOIP2018游记
    CF1043
    洛谷P1280 尼克的任务
    洛谷P1155 双栈排序
    SPOJ6340 ZUMA
    chessboard
  • 原文地址:https://www.cnblogs.com/piaomiaohongchen/p/9102801.html
Copyright © 2020-2023  润新知