MySQL数据库基础-SQL注入漏洞及解决方案

本文介绍了SQL注入漏洞的基本概念,通过一个实例展示了如何利用SQL注入进行非法登录,并详细分析了漏洞的原因。解决方案是使用Preparedstatement对象,预编译SQL并使用占位符防止关键字被误识别,从而有效防止SQL注入问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL注入漏洞及解决方案

什么是SQL注入漏洞?
  在早期互联网上SQL注入的漏洞是普遍存在的。有一个网站,用户注册以后根据用户名和密码可以完成登录,假设现在用户名被其他人知道了,但是其他人不知道密码,他也可以登录到网站上进行相应的操作。
演示SQL注入的漏洞
这里有用到 前面文章所提到的自己写的JDBC连接数据库的工具类!!!
数据库查询文件:

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCdemo03 {
    /*
    用户登录功能
    */
    public boolean login(String username, int password) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        //定义一个变量
        boolean flag = false;
        try {
            //获得连接
            conn = JDBCUtils.getConnection();//JDBCUtils自己的数据库连接工具类
            //完成登录功能
            //创建执行SQL语句的对象
            stmt = conn.createStatement();
            //编写SQL语句
            String sql = "select * from student where name = '" + username + "' and cno = '" + password + "'";
            //执行SQL语句
            rs = stmt.executeQuery(sql);
            if (rs.next()) {
                //说明根据用户名和密码可以查询到当前这条记录
                flag = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(rs, stmt, conn);
        }
        return flag;
    }
}

数据库登录文件:

public class JDBCdemo04 {
	/*
	漏洞演示
	*/
    public static void main(String[] args) {
        JDBCdemo03 userDao = new JDBCdemo03();
        boolean flag = userDao.login("张三","1990-09-01");//登录成功!!!
        //boolean flag = userDao.login("张三' or '1=1'","asmdasjdlsa");//登录成功
        //boolean flag = userDao.login("张三' --","asmdasjdlsa");//登录成功
        if (flag){
            System.out.println("登陆成功!!!");
        }else{
            System.out.println("登录失败!!!");
        }
    }
}

SQL注入漏洞分析:

在这里插入图片描述
SQL注入漏洞解决:
 需要采用Preparedstatement对象解决SQL注入漏洞。这个对象将SQL预先进行编译,使用?作为占位符。?所代表的内容是SQL所固定的。再次传入变量(包含SQL的关键字),这时候也不会再识别这些关键字了。

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JDBCdemo03 {
    public boolean login(String username,int password){
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        //定义一个变量
        boolean flag = false;
        try{
            //获得连接
            conn = JDBCUtils.getConnection();
            //编写SQL语句
            String sql ="select * from student where name = ? and cno = ?";
            //预编译SQL
            pstmt = conn.prepareStatement(sql);
            //设置参数
            pstmt.setString(1,username);
            pstmt.setInt(2,password);
            //执行SQL语句
            rs = pstmt.executeQuery();
            if(rs.next()){
                //说明根据用户名和密码可以直接查询到这条记录
                flag = true;
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtils.release(rs,pstmt,conn);
        }
        return flag;
    }
}

用上面的测试类来测试,发现SQL注入的问题已经解决了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值