挖藕!模拟sql查看qq密码

  • 模拟抓取到的qq数据
  • 通过封装实现数据库的连接
    • 1. 创建配置文件(包含驱动,url 密码,用户名)
    • 2. 实现封装工具类(涉及类加载机制复习)
    • 3. 利用封装工具类实现插入数据
  • sql注入查看用户qq密码
  • 最后的结果(密码到手了哈哈哈!!!!!!!!!!!!!!!)
  • 漏洞的解决

模拟抓取到的qq数据


CREATE DATABASE `jdbcStudy` CHARACTER SET utf8 COLLATE utf8_general_ci;USE `jdbcStudy`;CREATE TABLE `users`(`id` INT PRIMARY KEY,`NAME` VARCHAR(40),`PASSWORD` VARCHAR(40),`email` VARCHAR(60),birthday DATE
);INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)
VALUES(1,猪猪侠,123456,zs@sina.com,1980-12-04),
(2,lisi,郭为,lisi@sina.com,1981-12-04),
(3,jbman,123456,wangwu@sina.com,1979-12-04)

结果(修改部分后)

通过封装实现数据库的连接

一般我们通过jdbc去操作数据库时是通过,加载驱动,连接数据库,通过数据库获得sql对象,再利用sql对象执行sql语句

但如果每次都需首先连接数据库代码将大大增加代码量,这里我们封装一个实现数据库连接的类来实现耦合

1. 创建配置文件(包含驱动,url 密码,用户名)

# properties 属性,特性
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=123456

2. 实现封装工具类(涉及类加载机制复习)

封装工具类来实现 加载驱动,获取连接数据库,释放连接。(以上都是每次不变的操作) I/O

注:这里涉及到 Properties类的使用,遗忘建议复习

package com.lesson02.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;//封装工具类来实现 加载驱动,获取连接数据库,释放连接。(以上都是每次不变的操作)  I/O
public class jdbcutils {//提升作用域private static String driver=null;private static String url=null;private static String username=null;private static String password=null;static{try{//从配置文件中读取InputStream in = jdbcutils.class.getClassLoader().getResourceAsStream("db.properties");Properties properties = new Properties();//读取到properties对象中properties.load(in);driver= properties.getProperty("driver");username=properties.getProperty("username");url=properties.getProperty("url");password=properties.getProperty("password");//驱动只需加载一次Class.forName(driver);} catch (Exception e) {e.printStackTrace();}}//获取连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url,username,password);}//释放连接资源public static void release(Connection connection, Statement statement, ResultSet resultSet) throws SQLException {if (resultSet!=null){resultSet.close();}if (statement!=null){statement.close();}if (connection!=null){connection.close();}}
}

3. 利用封装工具类实现插入数据

代码实现:利用封装工具类,通过反射利用工具类中方法,实现将数据插入数据库表

package com.lesson02.utils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class Testinsert {public static void main(String[] args) throws SQLException {Connection connection=null;Statement statement=null;ResultSet set=null;try {connection=jdbcutils.getConnection();//通过反射获取方法:获取数据库连接statement = connection.createStatement();String sql="INSERT INTO `users`(id,`NAME`,`PASSWORD`,`email`,`birthday`)"+"VALUES(6,'asd','123456','1231421@qq.com','2000-01-02')";int i = statement.executeUpdate(sql);if (i>0){System.out.println("插入成功 !");}} catch (SQLException throwables) {throwables.printStackTrace();}finally {//最后释放资源jdbcutils.release(connection,statement,set);}}
}

ps:之后的删除查找操作只需修改sql语句即可

sql注入查看用户qq密码

由于以上sql存在漏洞,会被攻击导致泄露,
实际上就是 SQL字符串可以与or拼接
在用statement对象执行sql语句时,会存在sql注入问题,(对用户输入数据的合法性没有判断或过滤不严)
例如
Name = " or 1=1 " --------->结果为true会查询所有结果

这样我们就可以由此得到所有人的密码了!!!哈哈哈

在通过执行Select时(这是我们不知道数据库表中的密码列)
我们可以通过利用sql注入缺陷来实现查表中的密码

这是我们乱输入的密码 :5sa6
再利用or 拼接即可查询道全部数据

   login(" asdsa 'or' 1=1","5sa6 'or' 1=1"); //乱输入的
package com.lesson02.utils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class SQL注入 {public static void main(String[] args) throws SQLException {//login("zhangsan","123456");login(" asdsa 'or' 1=1","5sa6 'or' 1=1"); //乱输入的}public static void login(String username,String password) throws SQLException {Connection connection=null;Statement statement=null;ResultSet set=null;try {connection=jdbcutils.getConnection();//通过反射获取方法:获取数据库连接statement = connection.createStatement();String sql="SELECT *FROM `users` WHERE  `NAME`='"+username+"'AND `PASSWORD`='"+password+"'";ResultSet set1 = statement.executeQuery(sql);while (set1.next()){System.out.println("抓取"+set1.getObject("NAME"));System.out.println("的密码是"+set1.getObject("PASSWORD"));System.out.println("================");}} catch (SQLException throwables) {throwables.printStackTrace();}finally {//最后释放资源jdbcutils.release(connection,statement,set);}}
}

最后的结果(密码到手了哈哈哈!!!!!!!!!!!!!!!)


漏洞的解决

解决方法:使用preparestatement来执行sql,更安全

PreparedStatement对象

PreparedStatement :防止SQL注入,效率更高

与statement的区别:后者并非直接传参,而是通过set方法进行传参,sql语句中的参数用 ?通配符

prepareStatement 防止SQL注入的本质是,将传递进来的参数当作字符
假设其中存在转义字符,比如说 ’ 会被直接转义

我们可以看下mysql的底层的setString();方法,其实就是用值代替了?的位置,并且在值的两边加上了单引号,然后再把值当中的所有单引号替换成了斜杠单引号,说白了就是把值当中的所有单引号给转义了!这就达到了防止sql注入的目的

package com.lesson02.utils;import java.sql.*;public class Testinsert {public static void main(String[] args) throws SQLException {Connection connection=null;PreparedStatement pst=null;//源码发现prestatement为其子类,传参方式不同try {connection=jdbcutils.getConnection();// 使用?占位符替代参数String sql="insert into `users` ('id','NAME','PASSWORD',`email`,`birthday`)values(?,?,?,?,?)";pst=connection.prepareStatement(sql);//需预编译//手动给参数赋值pst.setInt(1,4);pst.setString(2,"xue");pst.setString(3,"123456");pst.setString(4,"1223@ad.com");//注意点: sql.date  :数据库的时间//        util.date :java中的pst.setDate(5,new Date(new java.util.Date().getTime()));int i = pst.executeUpdate();if (i>0){System.out.println("插入成功 !");}} catch (SQLException throwables) {throwables.printStackTrace();}finally {//最后释放资源jdbcutils.release(connection,null,null);}}
}

这样,我们就无法随意抓取数据库中的字段了(555555555555555)

挖藕!模拟sql抓取qq密码相关推荐

  1. Python爬虫编程思想(103):项目实战--抓取QQ空间说说的内容

    本例使用Selenium完成一个综合项目,该项目可以QQ空间说说的内容.首先需要分析一下QQ空间说说的HTML代码. 由于进入QQ空间需要登录,所以抓取QQ空间说说的内容需要如下2步: 模拟登录 抓取 ...

  2. python 爬虫动态网页的区别_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取...

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  3. php正方系统抓取课表,以正方教务系统为例,用php模拟登陆抓取课表、空教室,抓取课表...

    以正方教务系统为例,用php模拟登陆抓取课表.空教室,抓取课表 课程格子和超级课程表这两个应用,想必大学生都很熟悉,使用自己的学号和教务系统的密码,就可以将自己的课表导入,随时随地都可以在手机上查看. ...

  4. 【php】curl模拟登录抓取页面信息

    [php]curl模拟登录抓取页面信息 在本项目中,使用php抓取四川大学综合教务网站的成绩信息.课程信息以及登录用户的基本资料,解析数据并存入数据库,以实现对所得信息的进一步分析,并呈现给用户. 本 ...

  5. Python爬虫如何去抓取qq音乐的歌手数据?

    自从学会爬虫之后是不是有一种我什么都想爬一下的冲动?今天小千就来教大家如何去抓取qq音乐的歌手数据,项目实操多练习能更快提升自己哦. 今天的项目目标就是获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的 ...

  6. MySQL SQL 优化命令行问题 SQL 抓取方式

    墨墨导读:优化的道路永无止境. 对于数据库来说安装,部署几乎是一次性的.后期的管理和优化是持续性的工作. 对于MySQL来说,可以说90%问题都在SQL语句上面.从问题SQL的筛选和优化,在MySQL ...

  7. python 模拟浏览器selenium_Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例...

    本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息.分享给大家供大家参考,具体如下: import time from multiprocessing import Poo ...

  8. 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  9. python采集直播间数据_Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例...

    本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息.分享给大家供大家参考,具体如下: import time from multiprocessing import Poo ...

最新文章

  1. C语音中声明与定义的区别
  2. java 不可修改的集合对象_[改善Java代码]asList方法产生的List对象不可更改
  3. 1G服务器网站,1核1g内存云服务器建网站
  4. 20210722-20211010当项目经理积累的管理经验_血泪史_项目管理经验001
  5. new 动手学深度学习V2环境安装
  6. php output详解,【PHP】Output Control 扩展详细解读
  7. PaddlePaddle(7)—— 项目全流程实战:公共场所吸烟检测与EasyEdge部署
  8. 系统编程IO操作 之 电子词典
  9. 省市县乡四级联动java代码,jQuery省市区街道四级联动代码
  10. 列线图实现预测模型可视化
  11. 集群容错机制:failover、failfast、failback、failsafe、forking
  12. matlab凑数求和,凑数求和算法 C语言问题 C语言求和算法
  13. 人生若梦,神马都是浮云,,,,,,,
  14. es6中的静态属性和方法
  15. PHP 项目 该网页无法正常运作情况,但没有报错
  16. 滚动轴承故障特征频率计算公式
  17. vue-pdf 插件 不翻页 滚动效果
  18. 一场世界杯比赛的时间把热情从38.5降到36.5
  19. 线程池详解-队列、抛弃策略
  20. vue项目之H5 app页面通过swiper实现中间变大,两边缩小的滑动轮播功能

热门文章

  1. 标注工具:parselmouth(歌声合成语音合成标注)
  2. linux快速删除大量目录,Linux 快速删除大量小文件方法
  3. 摩斯电码php源码,利用PHP怎么编写一个摩斯电码生成器
  4. win10读取不了U盘或者移动硬盘的解决方法
  5. pg_bulkload
  6. JAVA中三种URL连接方法
  7. nodejs+vue+elementui高校体育馆场地预订系统
  8. JS中every()方法
  9. 计算机整体工作计划,信息技术工作计划
  10. java新版本新特性