SQL注入问题及其解决

简介: SQL注入问题及其解决

先看下面的代码

public class Demo {
    public static void main(String[] args) throws Exception {
        //1. 提示用户录入他/她的用户名或者密码, 并接收.
        Scanner sc = new Scanner(System.in);
        System.out.println("请录入您的账号: ");
        String username = sc.nextLine();
        System.out.println("请录入您的密码: ");
        String password = sc.nextLine();
        //2. 注册驱动.
        //3. 获取连接对象.
        Connection conn = JDBCUtils.getConnection();
        //4. 根据连接对象, 获取可以执行SQL语句的对象.
        Statement stat = conn.createStatement();
        //5. 执行SQL语句, 获取结果集.
        String sql = "select * from users where username='" + username + "' and password='" + password + "';";
        ResultSet rs = stat.executeQuery(sql);
        //6. 操作结果集.
        System.out.println(rs.next() ? "登录成功" : "登录失败, 用户名或者密码错误!");
        //7. 释放资源.
        JDBCUtils.release(conn, stat, rs);


    }
}

这段代码中

//5.执行SQL语句,获取结果集
String sql = "select * from users where username='" + username + "' and password='" + password + "';";  

当我们passoword输入一个 1 'or’1 时,系统会自动将用户输入的符号和sql语句中的符号相匹配,然后结果就变成了以下这样:

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

这个条件始终成立,所以即使密码错误也能成功登录,因此我们需要使用预编译解决这个问题,不管用户传入什么内容,我们都当普通字符处理.

public class Demo {
    public static void main(String[] args) throws Exception {
        //1. 提示用户录入他/她的用户名或者密码, 并接收.
        Scanner sc = new Scanner(System.in);
        System.out.println("请录入您的账号: ");
        String username = sc.nextLine();
        System.out.println("请录入您的密码: ");
        String password = sc.nextLine();

        //2. 注册驱动.
        //3. 获取连接对象.
        Connection conn = JDBCUtils.getConnection();
        //4. 根据连接对象, 获取可以执行SQL语句的对象.
        //在这一步, 已经确定好了SQL语句的格式, 之后不管传入什么内容, 都会只当做普通字符处理.
        String sql = "select * from users where username=? and password=?;";
        PreparedStatement ps = conn.prepareStatement(sql);

        //给占位符填充值.
        ps.setString(1, username);          //占位符的索引从1开始.
        ps.setString(2, password);

        //5. 执行SQL语句, 获取结果集.
        ResultSet rs = ps.executeQuery();       //因为SQL语句已经进行了预编译, 且被ps对象所记录, 所以在执行SQL语句时, 无需在传入SQL语句了.
        //6. 操作结果集.
        System.out.println(rs.next() ? "登录成功" : "登录失败, 用户名或者密码错误!");
        //7. 释放资源.
        JDBCUtils.release(conn, ps, rs);


    }
}
目录
相关文章
|
8月前
|
SQL 安全 关系型数据库
SQL注入常用姿势
该内容介绍了SQL注入攻击和防御的一些基本概念,以及MySQL中的几个函数:`MID()`用于提取文本字段的字符,`LIMIT()`用于限制查询结果的数量,`COUNT()`计算元组数量。它还详细讲解了两种SQL注入方法:基于布尔盲注和基于时间盲注,包括如何猜解数据库、表和字段信息。此外,还提到了SQL注入工具Sqlmap的使用方法和一些绕过过滤策略。
59 0
SQL注入常用姿势
|
SQL 存储 JSON
|
SQL 开发框架 安全
浅谈如何防止sql注入
浅谈如何防止sql注入
153 0
|
SQL 安全 Oracle
sql注入详解-01
前言 本文主要记录之前在portswigger官方网站学习时的一些细节; 在不同的情况下会出现各种各样的SQL注入漏洞、攻击和技术。一些常见的SQL注入示例包括: 检索隐藏的数据,可以在其中修改SQL查询以返回其他结果。(就是能够查到其他的正常情况下你没有权限的看到的结果) 颠覆应用程序逻辑,你可以改变一个查询来干扰应用程序的逻辑。 联合攻击,可以从不同的数据库表检索数据。 检查数据库,从中可以提取关于数据库版本和结构的信息。 盲SQL注入,应用程序的响应中不返回你控制的查询结果。
303 0
sql注入详解-01
|
SQL Oracle 安全
sql注入详解-02
前言 在利用SQL注入漏洞时,通常需要收集数据库本身的一些信息。这包括数据库软件的类型和版本,以及数据库所包含的表和列的内容。
145 0
sql注入详解-02
|
SQL 存储 安全
sql注入详解
结构化查询语言(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。 SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限陷)。 即:注入产生的原因是后台服务器接收相关参数未经过滤直接带入数据库查询
|
SQL
sql注入playload总结
sql注入playload总结
889 0
|
存储 SQL 关系型数据库
SQL注入-脱库
网站存在SQL注入时,可以对其进行脱库,即获取数据库表中的内容,比如用户的敏感信息 注意 : MySQL5.0以后 才有information_schema这个默认数据库 一库三表六字段
327 0
|
SQL 数据库
sql注入总结
参考文献:https://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247484372&idx=1&sn=ffcc51a88c9acf96c312421b75fc2a26&chksm=ec1e33fc...
1370 0