JDBC系列--解决简单的SQL注入问题

简介: JDBC系列--解决简单的SQL注入问题

Preparedstatement :执行sql的对象


1. SQL注入问题


用户随便输入密码:a' or 'a' = 'a

String sql = "select * from user where username = '"+username+"' and password = '"+password+"'";
 System.out.println(sql);

拼接后的sql:select * from user where username = 'dafsdfda' and password = 'a' or 'a' = 'a'

请输入username: fassag 请输入password a' or 'a' = 'a Success!!!!!!


解决方案


通过Preparedstatement :执行sql

它是预编译的SQL( 一次编译、多次运行,省去了解析优化等过程,此外预编译语句能防止sql注入 。)

参数使用?作为占位符

全部的流程为:

步骠: 1.导入驱动jar包mysql-connector-java-5.1.37-bin.jar

2.注册驱动

3.获取数据库连接对象connection

4.定义sql 注意:sql的参数使用?作为占位符。如: select * from user where username ? and password ?;

5.获取执行sql语句的对象preparedstatement Connection.preparestatement(string sql) 6.给?赋值: *方法: setXXX(参数1,参数2) 参数1:?的位置编号 从1开始

参数2:?的值

7、执行sql,接受返回结果,不需要传递sql语句

8.处理结果

9.释放资源


小实例:


package cn.caq.jdbc;
import cn.caq.utils.JDBCutils;
import java.sql.*;
import java.util.Scanner;
/**
 * 需求:
 * 1.通过键盘录入用户名和密码
 * 2.判断用户是否登录成功
 */
public class JDBCDemo09 {
    public static void main(String[]args){
        //1.键盘录入,接受用户名和密码
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入username:");
        String username = scanner.nextLine();
        System.out.println("请输入password");
        String password = scanner.nextLine();
        //2.调用方法
//        JDBCDemo08 jdbcDemo08 = new JDBCDemo08();
//        boolean login = jdbcDemo08.login(username, password);
        boolean flag = new JDBCDemo09().login2(username, password);
        //3.判断结果,输出不同语句
        if (flag){
            System.out.println("Success!!!!!!");
        }else {
            System.out.println("username or passwd False!!!!!!!!");
        }
    }
    //登录方法
    public boolean login2(String username,String password){
        if (username == null || password == null){
            return false;
        }
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        //1.连接数据库
        try {
            conn = JDBCutils.getConnection();
            //2.定义sql
            String sql = "select * from user where username = ? and password = ?";
            //3.获取执行sql的对象
            pstmt = conn.prepareStatement(sql);
            //给?赋值
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            //4.执行sql语句
            rs = pstmt.executeQuery();
            //5.判断
            return rs.next();//有下一行返回true
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            JDBCutils.close(rs,pstmt,conn);
        }
        return false;//如果出现异常返回false
    }
}

SQL注入一般是通过利用SQL语句的规则使条件成立 它是

预编译的SQL( 一次编译、多次运行,省去了解析优化等过程,此外预编译语句能防止sql注入 。)

参数使用?作为占位符

能够解决简单的SQL注入的问题!!!


相关文章
|
2月前
|
SQL 监控 安全
SQL注入的实现原理以及防止
SQL注入的实现原理以及防止
|
2月前
|
SQL Java 应用服务中间件
Java项目防止SQL注入的四种方案
Java项目防止SQL注入的四种方案
41 0
|
1天前
|
SQL 存储 Java
如何避免SQL注入?
【4月更文挑战第30天】如何避免SQL注入?
5 0
|
13天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
20 0
|
21天前
|
SQL 安全 PHP
CTF--Web安全--SQL注入之Post-Union注入
CTF--Web安全--SQL注入之Post-Union注入
|
21天前
|
SQL Web App开发 安全
CTF-Web安全--SQL注入之Union注入详解
CTF-Web安全--SQL注入之Union注入详解
|
2月前
|
SQL 安全 测试技术
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
15 0
|
2月前
|
SQL 安全 API
|
3月前
|
SQL JSON 数据库
常见的sql注入类型闭合及符号
常见的sql注入类型闭合及符号
32 0
|
3月前
|
SQL 数据库 数据安全/隐私保护
sql注入碰到加密数据怎么办
sql注入碰到加密数据怎么办
20 1