zoukankan      html  css  js  c++  java
  • 防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement

    package com.swift;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class LoginJDBC$PreparedStatement {
    
        public static void main(String[] args) {
            User userZhangsan=new User("swift","123456' or '1'='1");
            if(login(userZhangsan)) {
                System.out.println("账号密码正确,登陆成功");
            }else {
                System.out.println("登陆失败");
            } 
        }
    
        private static boolean login(User userZhangsan) {
            
            Connection conn=null;
            PreparedStatement ps=null;
            ResultSet rs=null;
            try {
                //1、装载驱动
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            try {
                //2、链接数据库,使用com.mysql.jdbc.Connection包会出错
                conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sw_database?user=root&password=root");
                //3、创建连接语句
                ps=conn.prepareStatement("select * from sw_user where username='"+userZhangsan.getUsername()+"' and password='"+userZhangsan.getPassword()+"'");
                //4、执行SQL语句获得结果集
                rs=ps.executeQuery();
                if(rs.next()) {
                    return true;
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                //关闭结果集
                try {
                    if(rs!=null) {
                       rs.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //关闭连接语句
                try {
                    if(ps!=null) {
                       ps.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //关闭数据库连接
                try {
                    if(conn!=null) {
                        conn.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return false;
            
        }
    
    }
    上面代码中的sql语句通过字符串连接的方式,虽然已经使用了PreparedStatement,但依然不能防止注入,因为字符串连接可以加入'or '1'='1
    ps=conn.prepareStatement("select * from sw_user where username='"+userZhangsan.getUsername()+"' and password='"+userZhangsan.getPassword()+"'");
    将上面sql语句变为 select * from sw_user where username=? and password=?
    就不存在字符串连接,password 加上其他字符sql也无法执行
    所以代码修改如下:
    package com.swift;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class LoginJDBC$PreparedStatement2 {
    
        public static void main(String[] args) {
            User userSwift=new User("zhangsan","123456");
            if(login(userSwift)) {
                System.out.println("账号密码正确,登陆成功");
            }else {
                System.out.println("登陆失败");
            } 
        }
    
        private static boolean login(User userSwift) {
            
            Connection conn=null;
            PreparedStatement ps=null;
            ResultSet rs=null;
            try {
                //1、装载驱动
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            try {
                //2、链接数据库,使用com.mysql.jdbc.Connection包会出错
                conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sw_database?user=root&password=root");
                //3、创建连接语句
                ps=conn.prepareStatement("select * from sw_user where username=? and password=?");
                ps.setString(1, userSwift.getUsername());
                ps.setString(2, userSwift.getPassword());
                //4、执行SQL语句获得结果集
                rs=ps.executeQuery();
                if(rs.next()) {
                    return true;
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                //关闭结果集
                try {
                    if(rs!=null) {
                       rs.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //关闭连接语句
                try {
                    if(ps!=null) {
                       ps.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //关闭数据库连接
                try {
                    if(conn!=null) {
                        conn.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return false;
            
            
        }
    
    }
     
  • 相关阅读:
    题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
    冒泡排序、插入排序、快速排序
    去掉字符串中重复的字符
    建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
    day_1 练习2
    python-day 练习1
    python课程第一天笔记-la
    初学react,为什么页面不显示
    跟我一起学写插件开发
    网上下载的带特效的jquery插件怎么用
  • 原文地址:https://www.cnblogs.com/qingyundian/p/7569933.html
Copyright © 2011-2022 走看看