SQL注入及防止SQL注入

博客 分享
0 149
张三
张三 2022-03-22 19:57:11
悬赏:0 积分 收藏

SQL注入及防止SQL注入


?SQL注入

SQL注入是通过操作输入来修改事先定义好的SQL语句,对用户输入的字符串进行过滤,转义,限制或处理不严谨,导致用户可以通过输入精心构造的字符串去非法获取到数据库中的数据,以达到执行代码对服务器进行攻击的方法。

 现有一个数据库test中的表user,可以通过账号name,密码pass登录,查看id

 登录代码

package JDBCtest;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import java.util.Scanner;/* * 用户登录 */public class Demo4 {    public static void main(String[] args) throws Exception {        // 1.加载驱动        Class.forName("com.mysql.jdbc.Driver");        // 2.创建连接        String url = "jdbc:mysql:///test";        String username = "root";        String password = "1234";        Connection connection = DriverManager.getConnection(url, username, password);        // 接收用户名密码        Scanner sc = new Scanner(System.in);        String name = sc.next();        String pass = sc.next();// 3.sql语句        String sql = "Select * from user where name='" + name + "' and pass ='" + pass + "'";        // System.out.println(sql);        // 4.获取sql对象statement        Statement statement = connection.createStatement();        // 5.执行sql语句        ResultSet rs = statement.executeQuery(sql);                // 6.登录        if (rs.next()) {            System.out.println("登录成功");        } else {            System.out.println("登录失败");        }        // 7.释放资源        statement.close();        connection.close();    }}

通过表中账号密码登录成功

   

 由于账号或密码错误登录失败

  

 以上可以正确登录成功或失败

注意!

如果此时我这样输入 【lihua 'or'1'='1】,也成功登录了,但是数据库没根本没有这条数据

这是为什么呢?让我们从代码里找问题!

        String sql = "Select * from user where name='" + name + "' and pass ='" + pass + "'";

为了调用数据库,使用字符串拼接SQL语句

让我们打印一下输入 【lihua 'or'1'='1】的sql语句一探究竟

 select语句中的where条件可以看做两组并列(注意and在前先执行,or后执行)

 由于'1'='1'为TRUE,所以以上语句等价于肯定会登录成功!

同理输入【'or'1'='1'#  xxx】也能登陆成功

 这是由于#在SQL中是注释符号,以上语句等价于,于是就和上述情况一样了。


 

posted @ 2022-03-22 19:07 MMMMinoz 阅读(1) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员