SQL注入问题简单介绍
1.JDBC中使用Stement对数据库增删改查,
执行sql语句时使用拼接字符串会导致SQL注入
2.JDBC中使用PreaparedStement可以有效避免SQL注入问题

**
原因分析: 任意值’第一个引号与拼接字符串name匹配后,1=1恒成立,–将后面的密码pwd已经注释掉了,所以输入任意值都可以成功登录**

Statement:
例如输入:用户名: 任意值’ or 1=1 –
密码:任意值
原sql语句:select * from login where l_name=’"+name+"’ and l_pwd=’"+pwd+"’;
sql注入后:select * from login where l_name=’"+任意值’ or 1=1 --(1=1恒成立,后面的sql语句已经被注释)
+"’ and l_pwd=’"+任意值+"’;

PStatement:
因为其sql语句可以用占位符?且用setXXX()为其赋值,可以避免字符串拼接,以此来防止sql注入

应用实例:创建一个login数据表且设置好其用户名与密码,然后使用jdbc连接该数据库,其中登录数据库的账号和密码在java控制台中由键盘输入。

建表语句(本人使用的数据库是mysql数据库)

create datebase basketball;
use basketball;
create table login(l_id int not null primary key,l_name varchar(10) not null,l_pwd varchar(5) not null
)
insert into login values(1,"zs","abc");
select * from login;

SQL_Stmt.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;public class SQL_Stmt {private static final String URL = "jdbc:mysql://127.0.0.1:3306/basketball";private static final String USERNAME = "root";private static final String PWD = "123abc";private static final String DRIVER="com.mysql.jdbc.Driver";public static void query() {Connection con=null;Statement stmt=null;ResultSet rs=null;try {//1.加载具体的驱动类:Class.forName()Class.forName(DRIVER);System.out.println("加载驱动类成功!");//2.连接数据库:DriverManager.getConnection()con=DriverManager.getConnection(URL,USERNAME,PWD);System.out.println("连接数据库成功!");//3.获取操作数据库对象:con.createStatement()stmt=con.createStatement();//sql注入示例:Statement//拼接字符串可以实现sql注入:任意值' or 1=1 --Scanner input=new Scanner(System.in);System.out.println("请输入用户名:");String name=input.nextLine();System.out.println("请输入密码:");String pwd=input.nextLine();String sql="select count(*) from login where l_name='"+name+"' and l_pwd='"+pwd+"'";//4.返回到结果集rsrs=stmt.executeQuery(sql);System.out.println("查询数据成功!");//5.获取数据:rs.next(),rs.getXXX()       int count=-1;while(rs.next()!=false) {count=rs.getInt(1);}if(count>0)System.out.println("登录成功!");elseSystem.out.println("登录失败!");       } catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {try {//关闭jdbc三幻神if(rs!=null) rs.close();if(stmt!=null) stmt.close();if(con!=null) con.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}      }   }public static void main(String[] args) {query();}
}

测试截图

理论上其注入语句是可以成功登录的是应该成功的,但本人水平有限且写博客的目的是给自己加深记忆,就不在此过多耗费时间

SQL_Pstmt.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;public class SQL_Pstmt {private static final String URL = "jdbc:mysql://127.0.0.1:3306/basketball";private static final String USERNAME = "root";private static final String PWD = "123abc";private static final String DRIVER = "com.mysql.jdbc.Driver";public static void query() {Connection con = null;PreparedStatement pstmt = null;ResultSet rs = null;try {// 1.加载具体的驱动类:Class.forName()Class.forName(DRIVER);System.out.println("加载驱动类成功!");// 2.连接数据库:DriverManager.getConnection()con = DriverManager.getConnection(URL, USERNAME, PWD);System.out.println("连接数据库成功!");// 3.获取操作数据库对象:con.createStatement()Scanner input = new Scanner(System.in);System.out.println("请输入用户名:");String name = input.nextLine();System.out.println("请输入密码:");String pwd = input.nextLine();System.out.println("获取操作数据库对象成功!");String sql = "select count(*) from login where l_name=? and l_pwd=?";pstmt = con.prepareStatement(sql);pstmt.setString(1, name);pstmt.setString(2, pwd);// 4.返回到结果集rsrs = pstmt.executeQuery();System.out.println("查询数据成功!");// 5.获取数据:rs.next(),rs.getXXX()int count = -1;while (rs.next() != false) {count = rs.getInt(1);}if (count > 0)System.out.println("登录成功!");elseSystem.out.println("登录失败!");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {// 关闭jdbc三幻神if (rs != null)rs.close();if (pstmt != null)pstmt.close();if (con != null)con.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static void main(String[] args) {query();}
}

测试截图

JDBC:使用Statement操作数据库时产生的SQL注入问题原因分析相关推荐

  1. javaWeb基础一:JDBC (java操作数据库的技术)

    1. JDBC 1.1 含义 JDBC : java database connectivity 由SUN公司提供的一套操作数据库的标准规范. JDBC与数据库驱动的关系:接口与实现的关系. 1.2 ...

  2. JDBC-使用Statement操作数据库的弊端

    使用Statement操作数据库的弊端 问题一:存在拼串操作 假设情景如下:当从控制台输入需要在数据库查询的用户名密码时,此时存在拼串操作,操作繁琐且可读性差 问题二:sql注入问题 所以为了避免sq ...

  3. 多线程操作数据库时为了防止数据的增删改的混乱该在数据库层还是程序层面上进行同步?

    多线程操作数据库时为了防止数据的增删改的混乱该在数据库层还是程序层面上进行同步? [问题点数:60分,结帖人jiao_zg] 不显示删除回复 显示所有回复 显示星级回复 显示得分回复 只显示楼主 收藏 ...

  4. java连接本地数据库命令_Java操作数据库时一次连接只能执行一条SQL命令

    Java操作数据库时一次连接只能执行一条SQL命令 答:× 全面深化改革要攻坚涉险,必须坚持正确的思想方法,不断探索和把握全面深化改革的内在规律,特别是要把握和处理好全面深化改革中的等重大关系 答:整 ...

  5. Java数据库连接--JDBC基础知识(操作数据库:增删改查)

    一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...

  6. Java JDBC基础 连接数据库 操作数据库

    1.JDBC概述 1.1 数据持久化 持久化(persistence) :把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应用数据持久化意味着将内存中的数据保存到硬盘上加以&qu ...

  7. jdbc驱动程序_JDBC操作数据库的步骤

    package mysql; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; /* ...

  8. 使用ADO操作数据库时一个好用的VARIANT类!

    inline CString VTOCSTR(VARIANT *v) {  if(v->vt==VT_BSTR)  {   CString str((LPCWSTR)v->bstrVal) ...

  9. python向数据库中添加参数_第四篇:python操作数据库时的传参问题

    python在操作数据库执行sql的时候我们经常会遇到传参问题,以下是我总结的几种方法: 1.格式化字符串 city = 'beijing' cur.execute("SELECT * FR ...

最新文章

  1. 【Python培训基础】一篇文件教你py文件打包成exe
  2. Largest Rectangle in a Histogram
  3. [面试]future模式
  4. 人脸对齐--One Millisecond Face Alignment with an Ensemble of Regression Trees
  5. linux开终端失败,Linux:终端提示符 (prompt) 不如期生效原因
  6. input type=file change事件只触发一次
  7. web 开发之js---js 中的数组操作
  8. CBOW模型的学习、Trainer类的实现
  9. 如何用python的i2c教程_Micropython TPYBoard I2C的用法
  10. 拓端tecdat|R语言中绘制箱形图的替代品:蜂群图和小提琴图
  11. Linux安装maven(超详细教程)
  12. Kotlin基础知识5
  13. PySpark | SparkSQL入门 | DataFrame入门
  14. 射频信号源进阶使用技巧【转载自微信公众号微波射频网】
  15. 【智哪儿评测】轻松玩转智能家居,萤石B1智家护卫传感套装评测
  16. 紫书已经基本学完现在开启紫书题目补完计划!!!
  17. 易拉罐增强WiFi信号
  18. 读书笔记-深度学习推荐系统4-推荐与embedding
  19. 2021年漏洞小结-手工自检篇
  20. 数据结构与算法-单向链表的修改和删除操作

热门文章

  1. element-ui form表单如何逐个验证
  2. Project Anarchy 概要
  3. vision引擎中地形着色器介绍
  4. 大一学生计算机专业用什么电脑,大一学生选电脑的几个注意事项, 学会了, 大学四年不用换电脑...
  5. GPT4All开源的聊天机器人
  6. 视频教程-Python科学计算与图形渲染库-大数据
  7. 支付宝,微信免签支付,不接第三方平台
  8. macbookair连接iPhone时断断续续连接不稳定的解决方法
  9. IDEA中将maven项目导出打包成war包
  10. FSCK与日志文件系统