在数据库中生成 一个用户表  有用户名 username 和密码password 字段 并插入两组数据

正常的sql查询结果

非正常查询途径返回的结果

下面用一段java代码 演示一下用户登录时的sql注入问题

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner; import com.mysql.jdbc.Driver; /*
* Java程序实现用户登录,用户名和密码,数据库检查
* 演示被别人攻击
*/
public class JDBCDemo2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/mybase";
String username="root";
String password="123456";
Connection conn=DriverManager.getConnection(url,username,password);
//3.创建方法执行对象
Statement stat=conn.createStatement(); Scanner sc=new Scanner(System.in);
System.out.print("请输入用户名:");
String user=sc.nextLine();
System.out.print("请输入密码:");
String pwd=sc.nextLine(); //执行SQL语句,数据表,查询用户名和密码,如果存在,登陆成功,不存在登陆失败
String sql="select * from users where username='"+user+"' and password='"+pwd+"'";
System.out.println(sql);
ResultSet rs=stat.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getString("password"));
} rs.close();
stat.close();
conn.close();
}
}

控制台输入 输出

刚刚控制台输入的用户名是存在的

下面输入瞎写的用户名和密码同样可以得到所有用户名和对应的密码,此谓sql的注入攻击

解决方式,使用Statement的子类接口 PrepareStatement

该接口是由数据库厂商提供实现类方法,我们直接调用即可,使用这个子类接口,完美解决了上述问题,所以成为java 连接数据库执行的一个标准步骤

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner; /*
* Java程序实现用户登录,用户名和密码,数据库检查
* 防止注入攻击
* Statement 接口实现类,作用执行SQL语句,返回结果集
* 有一个子接口PreparedStatement (SQL预编译存储,多次高效的执行SQL)
* PreparedStatement prepareStatement(String sql)
*
*/
public class JDBCDemo3 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/mybase";
String username="root";
String password="123456";
Connection con=DriverManager.getConnection(url,username,password);
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名:");
String user=sc.nextLine();
System.out.println("请输入密码:");
String pwd=sc.nextLine();
String sql="select * from users where username=? and password=?";
PreparedStatement ps=con.prepareStatement(sql);
ps.setObject(1, user);
ps.setObject(2, pwd); ResultSet rs=ps.executeQuery();
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getShort("password"));
}
rs.close();
ps.close();
con.close(); }
}

正确输入后的输出

故技重施:来一次sql注入

发觉根本不行!

java模拟一次简单的sql注入的更多相关文章

  1. 简单的SQL注入学习

    引贴: http://blog.163.com/lucia_gagaga/blog/static/26476801920168184648754/ 首先需要编写一个php页面,讲php页面放入/opt ...

  2. 实验吧_简单的sql注入_1、2、3

    简单的sql注入1 看着这个简单的界面,一时间没有特别好的思路,先输入一个1',发生了报错 初步猜测这是一个字符型的注入,他将我们输入的语句直接当成sql语句执行了,按题目的意思后面肯定过滤了很多注入 ...

  3. 【实验吧】CTF_Web_简单的SQL注入之3

    实验吧第二题 who are you? 很有意思,过两天好好分析写一下.简单的SQL注入之3也很有意思,适合做手工练习,详细分析见下. http://ctf5.shiyanbar.com/web/in ...

  4. 【实验吧】CTF_Web_简单的SQL注入之1

    题目链接:http://ctf5.shiyanbar.com/423/web/ 简单的SQL注入之1,比2,3都简单一些.利用2 的查询语句也可以实现:1'/**/union/**/select/** ...

  5. 实验吧之【简单的sql注入 1、2、3】

    实验吧的三道sql注入(感觉实验吧大部分web都是注入) 简单的SQL注入 地址:http://ctf5.shiyanbar.com/423/web/ 这道题也是sql注入,输入1,页面显示正常,输出 ...

  6. 实验吧简单的SQL注入1,简单的SQL注入

    接上面一篇博客. 实验吧简单的sql注入1 题目连接   http://ctf5.shiyanbar.com/423/web/ 同样,直接输入 1加个但引号,结果下面有返回错误,            ...

  7. 实验吧简单的sql注入3

    今天早上起来发现有人评论说我没更新实验吧sql注入3,主要是因为前段时间都去做bugku去了 但是重做这道题发现以前的姿势不行了,exp()报错不再溢出,现在不能用这个姿势,所以这里重新整理了一遍思路 ...

  8. 一道简单的SQL注入题

    这是我真正意义上来说做的第一道SQL题目,感觉从这个题目里还是能学到好多东西的,这里记录一下这个题目的writeup和在其中学到的东西 link:https://www.ichunqiu.com/ba ...

  9. [初学Python]编写一个最简单判断SQL注入的检测工具

    0x01 背景 15年那会,几乎可以说是渗透最火的一年,各种教程各种文章,本人也是有幸在那几年学到了一些皮毛,中间因学业问题将其荒废至今.当初最早学的便是,and 1=1 和 and 1=2 这最简单 ...

随机推荐

  1. PAT Basic 1085

    1085 PAT单位排行 每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式: 输入第一行给出一个正整数 N(≤10​5​​),即考生人数.随后 N 行, ...

  2. 关于mybatis 一级缓存引发的问题

    场景: 由于在一个方法中存在多个不同业务操作 private void insertOrUpdateField(CompanyReport entity) { //计算并数据 calcReportDa ...

  3. leetcode 【 Trapping Rain Water 】python 实现

    题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...

  4. 2017腾讯Web前端实习生招聘笔试题总结

    指针与引用的区别 考察margin塌陷 考察C++继承和~符号 考察TCP通讯过程 位码 三次握手 为什么不是两次握手 为什么不是四次握手 四次挥手 为什么要四次握手 TCP的状态 考察严格模式 进程 ...

  5. 再写一篇tps限流

    再写一篇tps限流 各种限流算法的称呼 网上有很多文章介绍限流算法,但是对于这些算法的称呼与描述也是有点难以理解.不管那么多了.我先按我理解的维度梳理一下. 主要维度是:是正向计数还是反向计数.是定点 ...

  6. 【SDOI2009】HH的项链 线段树

    题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...

  7. hnust 聚宝盆

    问题 A: 聚宝盆 时间限制: 1 Sec  内存限制: 128 MB提交: 663  解决: 282[提交][状态][讨论版] 题目描述 Grace是个善良的同学,他经常帮助同学解决问题.这天,他正 ...

  8. Halcon18 windows 下载

    Halcon18 windows 下载地址:http://www.211xun.com/download_page_13.html HALCON 18 是一套机器视觉图像处理库,由一千多个算子以及底层 ...

  9. 删除 node 【笔记】

    sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receip ...

  10. 团队Alpha版本冲刺(三)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最 ...