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


    }
}
目录
相关文章
|
1月前
|
SQL 安全 关系型数据库
了解SQL注入
SQL 注入是一种攻击手法,通过篡改这些语句来颠覆应用程序的正常流程。这种攻击利用输入验证不足或不当构造的 SQL 语句,可能带来认证绕过、信息泄露、数据损坏或恶意代码分发等安全风险。SQL 注入因其普遍性和潜在危害被 OWASP 列为 Web 应用程序首要威胁。防御策略包括严格的数据验证(如白名单机制)、使用参数化查询及拦截 SQL 错误消息等。此外,网络层面的防御如入侵防御系统 (IPS) 也能提供额外保护,尤其是在无法修改应用程序的情况下。
|
4月前
|
SQL 安全 关系型数据库
SQL注入常用姿势
该内容介绍了SQL注入攻击和防御的一些基本概念,以及MySQL中的几个函数:`MID()`用于提取文本字段的字符,`LIMIT()`用于限制查询结果的数量,`COUNT()`计算元组数量。它还详细讲解了两种SQL注入方法:基于布尔盲注和基于时间盲注,包括如何猜解数据库、表和字段信息。此外,还提到了SQL注入工具Sqlmap的使用方法和一些绕过过滤策略。
41 0
SQL注入常用姿势
|
SQL 存储 前端开发
SQL注入(一)
sql注入就是指web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数可以操控,并且带入数据库进行查询,攻击者可以利用恶意的sql语句来操作数据库。
|
SQL 存储 JSON
|
SQL API 数据库
|
SQL 开发框架 安全
浅谈如何防止sql注入
浅谈如何防止sql注入
133 0
|
SQL 安全 Oracle
sql注入详解-01
前言 本文主要记录之前在portswigger官方网站学习时的一些细节; 在不同的情况下会出现各种各样的SQL注入漏洞、攻击和技术。一些常见的SQL注入示例包括: 检索隐藏的数据,可以在其中修改SQL查询以返回其他结果。(就是能够查到其他的正常情况下你没有权限的看到的结果) 颠覆应用程序逻辑,你可以改变一个查询来干扰应用程序的逻辑。 联合攻击,可以从不同的数据库表检索数据。 检查数据库,从中可以提取关于数据库版本和结构的信息。 盲SQL注入,应用程序的响应中不返回你控制的查询结果。
278 0
sql注入详解-01
|
SQL Oracle 安全
sql注入详解-02
前言 在利用SQL注入漏洞时,通常需要收集数据库本身的一些信息。这包括数据库软件的类型和版本,以及数据库所包含的表和列的内容。
124 0
sql注入详解-02
|
SQL 存储 安全
浅谈SQL注入
浅谈SQL注入,SQL注入漏洞的产生需要满足的两个条件:1、参数用户可控:前端传给后端的参数内容是用户可以控制的2、参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询
171 0
|
SQL 存储 安全
sql注入详解
结构化查询语言(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。 SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限陷)。 即:注入产生的原因是后台服务器接收相关参数未经过滤直接带入数据库查询