千家信息网

怎么防止SQL注入

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要介绍了怎么防止SQL注入,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SQL注入即是指web应用程序对用户输入数据的合法性
千家信息网最后更新 2025年11月09日怎么防止SQL注入

这篇文章主要介绍了怎么防止SQL注入,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

1、SQL注入案例

模拟一个用户登录的SQL注入案例,用户在控制台上输入用户名和密码, 然后使用 Statement 字符串拼接的方式实现用户的登录。

1.1 数据库中先创建用户表及数据

-- 创建一张用户表CREATE TABLE `users` (  `id` INT(11) NOT NULL AUTO_INCREMENT,  `username` VARCHAR(20),  `password` VARCHAR(50),  PRIMARY KEY (`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8;-- 插入数据INSERT INTO  users(username,`password`) VALUES('张飞','123321'),('赵云','qazxsw'),('诸葛亮','123Qwe');INSERT INTO  users(username,`password`) VALUES('曹操','741258'),('刘备','plmokn'),('孙权','!@#$%^');-- 查看数据SELECT  * FROM users;

1.2 编写一个登录程序

import java.sql.*;import java.util.Scanner;public class TestSQLIn {    public static void main(String[] args) throws ClassNotFoundException, SQLException {        Class.forName("com.mysql.jdbc.Driver");        String url = "jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=UTF-8";        Connection conn = DriverManager.getConnection(url,"root","123456");        //System.out.println(conn);        // 获取语句执行平台对象 Statement        Statement smt = conn.createStatement();        Scanner sc = new Scanner(System.in);        System.out.println("请输入用户名:");        String userName = sc.nextLine();        System.out.println("请输入密码:");        String password = sc.nextLine();        String sql = "select  * from users where username = '" + userName + "'  and  password = '" + password +"'";        //打印出SQL        System.out.println(sql);        ResultSet resultSet = smt.executeQuery(sql);        if(resultSet.next()){            System.out.println("登录成功!!!");        }else{            System.out.println("用户名或密码错误,请重新输入!!!");        }        resultSet.close();        smt.close();        conn.close();    }}

1.3 正常登录

输入正确的用户名及密码后提示"登录成功"

1.4 登录失败

输入用户名或密码错误时,提示"用户名或密码错误,请重新输入"

1.5 模拟SQL注入

拼接的字符串中有or '1'='1' 为恒成立条件,因此 及时前面的用户及密码不存在也会取出所有记录,因此提示"登录成功"

1.6 SQL语法报错

使用拼接的方式,还会出现SQL语法错误等报错,例如

2. 解决方案

使用Statement方式,用户可以通过字符串拼接,改变原本SQL真正的含义,导致存在SQL注入的风险。解决SQL注入,可以通过预处理对象PreparedStatement来代替Statement进行处理。

1.1 编写一个新程序

import java.sql.*;import java.util.Scanner;public class TestSQLIn {    public static void main(String[] args) throws ClassNotFoundException, SQLException {        Class.forName("com.mysql.jdbc.Driver");        String url = "jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=UTF-8";        Connection conn = DriverManager.getConnection(url,"root","123456");        //System.out.println(conn);        // 获取语句执行平台对象 Statement        // Statement smt = conn.createStatement();        Scanner sc = new Scanner(System.in);        System.out.println("请输入用户名:");        String userName = sc.nextLine();        System.out.println("请输入密码:");        String password = sc.nextLine();        String sql = "select  * from users where username = ? and  password = ? ";        // System.out.println(sql);        // ResultSet resultSet = smt.executeQuery(sql);        PreparedStatement preparedStatement = conn.prepareStatement(sql);        preparedStatement.setString(1,userName);        preparedStatement.setString(2,password);        ResultSet  resultSet = preparedStatement.executeQuery();        if(resultSet.next()){            System.out.println("登录成功!!!");        }else{            System.out.println("用户名或密码错误,请重新输入!!!");        }        preparedStatement.close();        resultSet.close();        // smt.close();        conn.close();    }}

2.2 正常登录

2.3 用户名密码错误

当用户名或密码输入错误时,会提示"用户名或密码错误,请重新输入"

2.4 模拟SQL注入

按照之前的情况,进行SQL注入的写法,测试后不再出现SQL注入情况。

2.5 模拟SQL语法错误

使用预处理类后,输入带有单引号或双引号的内容也不会再出现SQL语法错误的报错

3. 小结

Statement 与 PreparedStatement的主要区别如下:

  • Statement用于执行静态SQL语句,在执行时,必须指定一个事先准备好的SQL语句

  • PrepareStatement是预编译的SQL语句对象,语句中可以包含动态参数"?",在执行时可以为"?"动态设置参数值

  • PrepareStatement可以减少编译次数提高数据库性能

感谢你能够认真阅读完这篇文章,希望小编分享的"怎么防止SQL注入"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

用户 输入 密码 用户名 错误 登录 数据 语句 成功 对象 程序 篇文章 语法 提示 字符 字符串 情况 数据库 方式 动态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 我的世界服务器资源加载 传世装备数据库 限制数据库条数据类型 软件开发的核心是什么 国家税务总局网络安全周 学软件开发的去当文员 下列关于网络数据库 争当网络安全小卫士手抄报的通知 网络安全讲课主题和讲授大纲 MVC 服务器 广州思力智慧互联网科技电话 吉林移动软件开发公司 湖北惠普服务器维修维保多少钱 学软件开发上哪 互联网信息科技专业好就业吗 广电网络安全机房安全规程 计算机新型网络技术 不动产数据库结构调整的生态效益 网络安全法 立法定位 svn管理服务器软件 国际网络安全企业50强 玉溪市网络安全领导小组 高级索引技术 数据库系统概念 软件开发人生规划书 期刊数据库是什么文献 mock单元测试连接数据库 厦门app软件开发聚顶科技 软件开发项目评价 相机数据恢复软件开发 云南网络安全专业研究生招收分数
0