了解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注入及如何解决的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2019328.html

(0)
上一篇 2025年2月23日 18:47:26
下一篇 2025年2月23日 18:47:49

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 利用Linux服务器保护Web接口免受SQL注入攻击。

    利用Linux服务器保护Web接口免受SQL注入攻击 随着互联网的发展,Web接口的使用越来越普遍,从而也增加了Web应用程序受到SQL注入攻击的风险。SQL注入攻击是一种利用Web应用程序中未经过滤的用户输入,从而在数据库中执行恶意SQL…

    2025年3月6日
    200
  • php如何防止sql注入攻击

    php简单实现防止sql注入的方法 方法一:execute代入参数  $var_Value) {    //获取POST数组最大值    $num = $num + 1;  }  //下标为i的数组存储的是商品id, 下标为j数组的存储的是…

    2025年3月5日
    400
  • php如何防sql注入?

    sql注入(sqli)是一种注入攻击,,可以执行恶意sql语句。它通过将任意sql代码插入数据库查询,使攻击者能够完全控制web应用程序后面的数据库服务器。 攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身…

    2025年3月5日
    200
  • 如何使用PHP防御SQL注入与远程文件包含攻击

    如何使用php防御sql注入与远程文件包含攻击 随着互联网的发展,网络安全问题变得日益严重。在Web开发过程中,SQL注入和远程文件包含攻击是最常见的安全漏洞之一。对于PHP这样的服务器端脚本语言来说,合理地防御这些攻击是至关重要的。本文将…

    编程技术 2025年3月5日
    200
  • PHP安全编程实践:防止SQL注入攻击

    php安全编程实践:防止sql注入攻击 在当今互联网时代,网站的安全性成为了极其重要的问题。尤其是对于使用PHP编程语言开发的网站来说,防止SQL注入攻击是一项至关重要的任务。本文将介绍一些PHP安全编程实践,旨在帮助开发人员提高程序的安全…

    编程技术 2025年3月5日
    200
  • 防止SQL注入的ASP.NET方法实例解析

    最近接手别人一个项目,发现存在sql注入漏洞,因为不想改太多代码,所以那种参数法防注入呢我就用不着了。只能用传统的笨一点的办法了。 1、新建Global.asax文件。 2、加入如下代码: void Application_BeginReq…

    编程技术 2025年3月3日
    200
  • Python开发注意事项:避免常见的安全漏洞

    Python作为一种简单易学的编程语言,被广泛应用于各类软件开发项目中。然而,随着互联网的发展和信息安全的重要性日益凸显,开发者们也越来越需要关注代码的安全性。本文将介绍一些在Python开发过程中需要注意的常见安全漏洞,并提供一些避免这些…

    2025年2月26日
    200
  • php用什么方法防止sql注入攻击

    在服务器端进行配置 安全,PHP代码编写是一方面,PHP的配置更是非常关键。我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执…

    2025年2月25日
    200
  • php防止sql注入的方法总结

    php防止sql注入的方法 【一、在服务器端配置】 安全,PHP代码编写是一方面,PHP的配置更是非常关键。 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配…

    2025年2月25日
    200
  • 快速了解sql注入基本原理

    SQL注入基本原理 WEB技术发展日新月异,但是徒手拼SQL的传统手艺还是受相当多的开发者亲睐。毕竟相比于再去学习一套复杂的ORM规则,手拼更说方便,直观。通常自己拼SQL的人,应该是有听说过SQL注入很危险,但是总是心想:我的SQL语句这…

    2025年2月23日
    200

发表回复

登录后才能评论