JDBC中使用preparedStatement防止SQL注入

一、SQL注入

SQL注入是一种比较常见的网路攻击方式,一些恶意人员在需要用户输入的地方,恶意输入SQL语句的片段,通过SQL语句,实现无账号登录,甚至篡改数据库。

二、SQL注入实例

登录场景:
在一个登录界面,要求用户输入账号和密码。

我们的代码中会有如下SQL语句:

String sql="select * from user where account='"+account+"' and password='"+password+"'";

情形1:(免账号登录)

账号:' or 1=1----后面有一个空格)
密码:
当我们输入了这个账号和密码,那么SQL语句就变成:String sql="select * from user where account='' or 1=1 -- ' and password=''";

在这里插入图片描述
这个查询条件就变成account=‘’ 或者1=1,这个条件是恒成立的。
后面的-- ,就是注释。
这样就可以实现免账号登录。

情形2:(删除数据库)

账号:';drop database test;----后面有一个空格)
密码:
当我们输入了这个账号和密码,那么SQL语句就变成:String sql="select * from user where account='';drop database test;-- ' and password=''";

在这里插入图片描述
这个查询条件就变成account=‘’ 或者1=1,这个条件是恒成立的。
后面的-- ,就是注释。
这样就能删除数据库。

三、防止SQL注入方法

使用PreparedStatement可以防止SQL注入。sql语句中的参数需要用?代替。PreparedStatement对sql预编译后,然后调用setXX()方法设置sql语句中的参数。这样再传入特殊值,也不会出现sql注入的问题了。

四、登录项目

1、用户表

用户的账号信息:

create table user(
id int primary key auto_increment,
account varchar(20),
password varchar(20),
nickname varchar(20)
);insert into user(account,password,nickname) values('Jack','123456','杰克');
insert into user(account,password,nickname) values('Mary','888888','玛丽');select*from user;

在这里插入图片描述
2、项目结构

创建一个javaweb项目。Login类实现登录功能,用Junit进行单元测试,创建LoginTest类实现登录测试功能。
在这里插入图片描述
3、登录实现

Login.java

package net.jdbc.test;import java.math.BigDecimal;
import java.sql.*;public class Login {//数据库url、用户名和密码static final String DB_URL="jdbc:mysql://localhost:3306/test?";static final String USER="root";static final String PASS="root123";public static void login(String account,String password) {try {//1、注册JDBC驱动Class.forName("com.mysql.jdbc.Driver");//2、获取数据库连接Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);//3、操作数据库String sql="select * from user where account=? and password=?";//获取操作数据库的对象//用PreparedStatement可以预防SQL注入PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1,account);//设置参数preparedStatement.setString(2,password);ResultSet resultSet = preparedStatement.executeQuery();//执行查询sql,获取结果集if (resultSet.next()){ //遍历结果集,取出数据String name = resultSet.getString("nickname");//输出数据System.out.println(name+"登录成功");}else{System.out.println("用户登录失败......");}//4、关闭结果集、数据库操作对象、数据库连接resultSet.close();preparedStatement.close();connection.close();} catch (ClassNotFoundException e) {e.printStackTrace();} catch(SQLException e){e.printStackTrace();} catch(Exception e){e.printStackTrace();}}}

4、登录测试

LoginTest.java

package net.jdbc.test;import org.junit.Test;import static org.junit.Assert.*;public class LoginTest {@Testpublic void login() {Login.login("' or 1=1-- ","");//SQL注入测试Login.login("Jack","123");//正确账号,错误密码Login.login("Jack","123456");Login.login("Mary","888888");}
}

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java预科篇1-学前

Java预科篇1-学前 1、markdown语法 Markdown是一种纯文本格式的标记语言。通过简单的标记语法,它可以使普通文本内容具有一定的格式。 优点: 因为是纯文本,所以只要支持Markdown的地方都能获得一样的编辑效果,可以让作者摆脱排…

Java预科篇2-环境搭建

Java预科篇2-环境搭建 1、Java历史 1995年 Java问世1996年 Java 1.01999年 Java 1.2发布(JAVA SE\JAVA EE\JAVA ME)… … …2004年 Tiger 发布(JAVA5.0),Java 登录火星2011年 7月由Oracle正式发布Java7.02014年 3月19日,Oracle公…

php中如何配置环境变量,如何配置phpstorm环境变量如何配置phpstorm环境变量

大话西游6664版。根据你的系统平台下载相应的版本后,如果是压缩文件,先解压后双击运行,不是压缩文件,直接双击运行就可以了,运行后出现下面的界面,在下面界面上单击“Next”。跟所有的软件安装包一样&#…

Java基础篇1——变量与数据类型

Java基础篇1——变量与数据类型 1、标识符命名规则 标识符以由大小写字母、数字、下划线(_)和美元符号($)组成,但是不能以数字开头。大小写敏感不能与Java语言的关键字重名不能和Java类库的类名重名不能有空格、、#、、-、/ 等符号长度无限制应该使用有意义的名称…

php伪静态后301,动态地址rewrite伪静态,然后301跳转到伪静态时死

本文章来给各位同学介绍动态地址rewrite伪静态,然后301跳转到伪静态时死循环解决办法,有碰到此类的朋友可进入参考。问题背景:矿秘书网的历史遗留问题,刚开始由于各种问题,一些动态页面都是用了?id参数的形式&#xf…

Java基础篇2——运算符

Java基础篇2——运算符 1、运算符 1.1、算数运算符 表示加法运算符-表示减法运算符*表示乘法运算符/表示除法运算符%表示取余运算符 1.2、关系运算符 所有以关系运算符作为最终运算的表达式结果一定是boolean类型 >表示是否大于运算符>表示是否大于等于运算符<表…

php 移植 arm 精简,arm linux 移植 PHP

背景&#xff1a;PHP 是世界上最好的语言&#xff0c;所以要考虑php的移植。host平台   &#xff1a;Ubuntu 16.04arm平台   &#xff1a; 3531darm-gcc   &#xff1a;4.9.4主机准备&#xff1a;使用以下脚本### Copyright By Schips, All Rights Reserved# https://git…

Java基础篇3——流程控制

Java基础篇3——流程控制 1、顺序结构 正常代码的流程即是顺序流程 2、分支结构 2.1、if-else分支 if(条件表达式) {语句块1; }if(条件表达式) {语句块1; } else {语句块2; }if(条件表达式1) {语句块1; } else if(条件表达式2) {语句块2; } else {语句块3; }2.2、switc…

hive mysql类型,(二)Hive数据类型、数据定义、数据操作和查询

1.数据类型1.1 基本数据类型Hive数据类型长度例子TINYINT1byte有符号整数20SMALINT2byte有符号整数20INT4byte有符号整数20BIGINT8byte有符号整数20BOOLEAN布尔类型&#xff0c;true或者falseTRUE FALSEFLOAT单精度浮点数3.14159DOUBLE双精度浮点数3.14159STRING字符系列。可以…

Error running tomcat8 Address localhost:1099 is already in use 错误解决

错误情况&#xff1a; 在IDEA上运行web项目时报错&#xff1a;Error running &#xff08;项目名&#xff09; Address localhost:1099 is already in use 解决方法&#xff1a; 第一步&#xff1a;打开Windows运行&#xff0c;如下图 第二步&#xff1a;按下回车或点击确定…

matlab数据处理 书,matlab数据处理记录

最近在看一篇论文&#xff0c;觉得文章的数据处理效果十分的惊艳&#xff01;所以想着如何用matlab将类似的效果实现出来&#xff0c;但最近有一个任务&#xff0c;以后慢慢更新吧&#xff01;先挖一个坑&#xff01;1. 二维图形绘制二维坐标轴图像涉及的部分包含曲线的颜色、点…

StringUtils系列之StringUtils.isNotBlank()和StringUtils.isNotBlank()的区别

/** 1.* StringUtils.isNotBlank();* 判断参数是否不为空.* 1.如果不为空返回true。* 2.如果为空返回false。* StringUtils.isNotEmpty(null) -> false* StringUtils.isNotEmpty("") -> false* StringUtils.isNotEmpty("a") -> true* StringUti…

matlab信号内插,基于VC++和Matlab的数字信号内插处理系统

0引言目前,利用并行交替式(Parallalinterleaving)技术,超高速数字化示波器的实时采样速率已突破了10Gsa/s。按照Nyquist定理,这种系统的实时带宽可接近5GHz。在数字化示波器中,由实时采样获得的样本数据原封不动地显示时,因采样理论和显示技术等缘故,可能会产生不同形式的视觉混…

MySQL-locate()函数

判断字符串&#xff08;string&#xff09;中是否包含另一个字符串&#xff08;subStr&#xff09;locate(subStr,string) &#xff1a;函数返回subStr在string中出现的位置 // 如果字符串 string 包含 subStr locate(subStr,string) > 0// 如果字符串 string 不包含 subSt…

MATLAB接收机位置解算,GPS-receiver GPS软件接收机代码 完整的捕获 解算定位 (可 8个通道) matlab 240万源代码下载- www.pudn.com...

文件名称: GPS-receiver下载 收藏√ [5 4 3 2 1 ]开发工具: matlab文件大小: 148 KB上传时间: 2015-07-02下载次数: 0提 供 者: 金亚强详细说明&#xff1a;GPS软件接收机代码 完整的捕获接受解算定位代码(可接受8个通道)-GPS software receiver codes文件列表(点击判断是…

Java基础篇4——数组

Java基础篇4——数组 1、数组的概念 当需要在Java程序中记录单个数据内容时&#xff0c;则声明一个变量即可当需要在Java程序中记录多个类型相同的数据内容时&#xff0c;则声明一个一维数 组即可&#xff0c;一维数组本质上就是在内存空间中申请一段连续的存储单元数组是相同…

python php ajax赔率,Ajax如何调用python脚本

用Flask很简单的&#xff1a;比如:index.html 放到templates文件夹下&#xff1a;$(function() {$(#calculate).click(function(){$.ajax({url: /addnumber,data:{a: $(#a).val(),b: $(#b).val()},dataType: JSON,type: GET,success: function(data){$("#result").ht…

Java面向对象编程篇1——类与对象

Java面向对象编程篇1——类与对象 1、面向过程 1.1、概念 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了 1.2、优缺点 优点&#xff1a;性能比面向对象高&#xff0c;因为类调用时…

python中发送带附件的邮件,python SMTP实现发送带附件电子邮件

本文实例为大家分享了python SMTP发送带附件电子邮件的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下可采用email模块发送电子邮件附件。发送一个未知MIME类型的文件附件其基本思路如下&#xff1a;1. 构造MIMEMultipart对象做为根容器2. 构造MIMEText对象做为邮件显…

Java面向对象编程篇2——面向对象三大特点

Java面向对象编程篇2——面向对象三大特点 1、封装 1.1、封装的概念 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值&#xff0c;无 论是编译阶段还是运行阶段都不会报错或者给出提示&#xff0c;此时与现实生活不符 为了避免上述错误的发生&#xff0c;就需…