搜索
首页数据库SQL了解SQL注入及如何解决

了解SQL注入及如何解决

Jan 28, 2021 pm 06:17 PM
sql注入

了解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;

了解SQL注入及如何解决

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 正常登录

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

了解SQL注入及如何解决

1.4 登录失败

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

了解SQL注入及如何解决

1.5 模拟SQL注入

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

了解SQL注入及如何解决

1.6 SQL语法报错

使用拼接的方式,还会出现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 正常登录

了解SQL注入及如何解决

2.3 用户名密码错误

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

了解SQL注入及如何解决

2.4 模拟SQL注入

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

了解SQL注入及如何解决

2.5 模拟SQL语法错误

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

了解SQL注入及如何解决

3. 小结

Statement 与 PreparedStatement的主要区别如下:

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

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

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

以上是了解SQL注入及如何解决的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:CSDN。如有侵权,请联系admin@php.cn删除
MySQL:SQL的特定实现MySQL:SQL的特定实现Apr 13, 2025 am 12:02 AM

MySQL是开源的关系型数据库管理系统,提供了标准SQL功能和扩展。1)MySQL支持标准SQL操作如CREATE、INSERT、UPDATE、DELETE,并扩展了LIMIT子句。2)它使用InnoDB和MyISAM等存储引擎,适用于不同场景。3)用户可以通过创建表、插入数据和使用存储过程等高级功能高效使用MySQL。

SQL:使所有人都可以访问数据管理SQL:使所有人都可以访问数据管理Apr 12, 2025 am 12:14 AM

sqlmakesdatamanagectAccessibletoAllbyProvidingAsimpleyetpoperfultoolSetSetForQuerquereingAndManagingDatabases.1)ItworkswithrelationalDatabases,允许inserstospecefifywhattheywanttododowithththedata.2)

SQL索引策略:通过数量级提高查询性能SQL索引策略:通过数量级提高查询性能Apr 11, 2025 am 12:04 AM

SQL索引可以通过巧妙的设计显着提升查询性能。 1.选择合适的索引类型,如B-tree、哈希或全文索引。 2.使用复合索引优化多字段查询。 3.避免过度索引以减少数据维护开销。 4.定期维护索引,包括重建和移除不必要的索引。

sql怎么删除约束sql怎么删除约束Apr 10, 2025 pm 12:21 PM

在 SQL 中删除约束,请执行以下步骤:识别要删除的约束名称;使用 ALTER TABLE 语句:ALTER TABLE 表名 DROP CONSTRAINT 约束名;确认删除。

sql触发器怎么设置sql触发器怎么设置Apr 10, 2025 pm 12:18 PM

SQL 触发器是一种在指定表上执行特定事件时自动执行特定操作的数据库对象。要设置 SQL 触发器,可以使用 CREATE TRIGGER 语句,其中包括触发器名称、表名称、事件类型和触发器代码。触发器代码使用 AS 关键字进行定义,并包含 SQL 或 PL/SQL 语句或块。通过指定触发器条件,可以使用 WHERE 子句限制触发器的执行范围。可以使用 INSERT INTO、UPDATE 或 DELETE 语句在触发器代码中执行触发器操作。NEW 和 OLD 关键字可以在触发器代码中用来引用受影

sql查询怎么加索引sql查询怎么加索引Apr 10, 2025 pm 12:15 PM

索引是一种通过排序数据列来加速数据查找的数据结构。为 SQL 查询添加索引的步骤如下:确定需要索引的列。选择合适的索引类型(B 树、哈希或位图)。使用 CREATE INDEX 命令创建索引。定期重建或重新组织索引以维护其效率。添加索引的好处包括提高查询性能、减少 I/O 操作、优化排序和筛选以及提高并发性。当查询经常使用特定列、返回大量数据需要排序或分组、涉及多个表或数据库表较大时,应该考虑添加索引。

sql语句ifelse怎么用sql语句ifelse怎么用Apr 10, 2025 pm 12:12 PM

IFELSE 语句是一种条件语句,用于根据条件评估结果返回不同值。其语法结构为:IF (condition) THEN return_value_if_condition_is_true ELSE return_value_if_condition_is_false END IF;。

sql数据库错误怎么查看sql数据库错误怎么查看Apr 10, 2025 pm 12:09 PM

SQL数据库错误查看方法有:1. 直接查看错误消息;2. 使用SHOW ERRORS和SHOW WARNINGS命令;3. 访问错误日志;4. 使用错误代码查找错误原因;5. 检查数据库连接和查询语法;6. 使用调试工具。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器