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);


    }
}
目录
相关文章
|
3月前
|
SQL 安全 关系型数据库
了解SQL注入
SQL 注入是一种攻击手法,通过篡改这些语句来颠覆应用程序的正常流程。这种攻击利用输入验证不足或不当构造的 SQL 语句,可能带来认证绕过、信息泄露、数据损坏或恶意代码分发等安全风险。SQL 注入因其普遍性和潜在危害被 OWASP 列为 Web 应用程序首要威胁。防御策略包括严格的数据验证(如白名单机制)、使用参数化查询及拦截 SQL 错误消息等。此外,网络层面的防御如入侵防御系统 (IPS) 也能提供额外保护,尤其是在无法修改应用程序的情况下。
|
SQL 存储 编解码
|
SQL 存储 JSON
|
SQL 开发框架 安全
浅谈如何防止sql注入
浅谈如何防止sql注入
141 0
|
SQL 安全 Oracle
sql注入详解-01
前言 本文主要记录之前在portswigger官方网站学习时的一些细节; 在不同的情况下会出现各种各样的SQL注入漏洞、攻击和技术。一些常见的SQL注入示例包括: 检索隐藏的数据,可以在其中修改SQL查询以返回其他结果。(就是能够查到其他的正常情况下你没有权限的看到的结果) 颠覆应用程序逻辑,你可以改变一个查询来干扰应用程序的逻辑。 联合攻击,可以从不同的数据库表检索数据。 检查数据库,从中可以提取关于数据库版本和结构的信息。 盲SQL注入,应用程序的响应中不返回你控制的查询结果。
289 0
sql注入详解-01
|
SQL 存储 安全
浅谈SQL注入
浅谈SQL注入,SQL注入漏洞的产生需要满足的两个条件:1、参数用户可控:前端传给后端的参数内容是用户可以控制的2、参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询
176 0
|
SQL 安全 数据库
sql注入
sql注入
135 0
|
SQL PHP 索引
BugkuCTF sql注入
前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文章的形式发表,感谢大家一直以来的支持和理解,共勉~~~ 点开链接一看 很明显可以看出查询key表,id=1的string字段 我们去构造payload: http://103.
989 0
|
SQL 安全 程序员