JDBC的使用(二):PreparedStatement接口;ResultSet接口(获取结果集);例题:SQL注入
ResultSet接口:类似于一个临时表,用来暂时存放数据库查询操作所获得的结果集。
getInt(), getFloat(), getDate(), getBoolean(), getString(), getObject(), next(),:将指针向下移一行。
例一:(输入用户名和密码验证是否登录成功):用Statement接口会导致,SQL注入!

下图是代码:
package com.inba.maya.chaxun; import java.sql.*;
import java.util.*; public class Text { public static void main(String[] args) throws Exception{
Scanner sc=new Scanner(System.in);
System.out.print("请输入用户名:");
String yhm=sc.nextLine();
System.out.print("请输入密码:");
String mm=sc.nextLine();
//第一种解决的方法:给用户名进行替换,把'换成".
//yhm=yhm.replaceAll("\'", "\"");
//一加载驱动
Class.forName("com.mysql.jdbc.Driver");
//二链接数据库
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=GBK","root","");
//创建SQL语句
Statement stat=conn.createStatement();
//采用字符串拼接的房方法会导致,SQL注入,从而导致错误发生,如控制台所示
//原因是:当我输入: sl服务网16' or 1=1 #;在代码中显示的是:
//所以当我输入的里面有'时就会和前面的'相匹配,or 1=1永远成立 #在SQL语句中是注释,所以才会登陆成功
String s="select * from user where username='"+yhm+"' and pasword='"+mm+"'";
ResultSet rs=stat.executeQuery(s);
if(rs.next()==true){
System.out.println("登陆成功,欢迎"+rs.getString(3));
}else{
System.out.println("对不起,您输入的用户名或密码不正确!");PreparedStatement
}
conn.close();
} }
解决的方法1:
第一种解决的方法:给用户名进行替换,把'换成".
yhm=yhm.replaceAll("\'", "\"");
解决的第二种方法:
用PreparedStatement接口,该接口继承自Statement接口,但是用于执行动态的SQL语句。通过PreparedStatement实例来执行SQL语句,将被预编译并保存到PreparedStatement实例中,从而可以反复执行该语句。
代码如下:
package com.inba.maya.chaxun; import java.sql.*;
import java.util.*; public class Text {
public static void main1(String[] args) throws Exception{
Scanner sc=new Scanner(System.in);
System.out.print("请输入用户名:");
String yhm=sc.nextLine();
System.out.print("请输入密码:");
String mm=sc.nextLine();
YanZheng(yhm, mm);
} private static void YanZheng(String yhm, String mm) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=GBK","root","");
String s="select * from user where username=? and pasword=?";
PreparedStatement ps=conn.prepareStatement(s);
ps.setString(1, yhm);
ps.setString(2, mm);
ResultSet rs=ps.executeQuery();
if(rs.next()==true){
System.out.println("登陆成功,欢迎"+rs.getString(3));
}else{
System.out.println("对不起,您输入的用户名或密码不正确!");
}
conn.close();
} }
JDBC的使用(二):PreparedStatement接口;ResultSet接口(获取结果集);例题:SQL注入的更多相关文章
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- JDBC基础学习(二)—PreparedStatement
一.PreparedStatement介绍 在SQL中包含特殊字符或SQL的关键字(如: ' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用P ...
- MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题
JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...
- Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法
sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...
- JDBC数据库编程:PreparedStatement接口
使用PreparedStatement进行数据库的更新及查询操作. PreparedStatement PreparedStatement是statement子接口.属于预处理. 使用statemen ...
- JDBC数据库编程:ResultSet接口
掌握ResultSet接口 使用ResultSet接口进行查询 ResultSet接口 在JDBC操作中,数据库所有查询记录将使用ResultSet进行接收,并使用ResultSet显示内容. 常用方 ...
- Java基础(三十一)JDBC(1)常用类和接口
1.Driver接口 每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的类.在加载某一驱动程序的Driver类时,它应该创建自己的实例并向java.sql.DriverMana ...
- JDBC之Statement 接口的测试(存在sql注入风险)
实现简单的登录功能 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impo ...
- SpringSecurity权限管理系统实战—二、日志、接口文档等实现
系列目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战 ...
随机推荐
- cf593c
题意:有n(n<=50)个圆,给出每个圆的圆心坐标和半径r(r>=2). 求两个函数f(t),g(t),t的取值为0到50的整数,每次令x=f(t),y=g(t),产生一个51个点的集合. ...
- jqueyr eq get用法
相信大部份人都会把这2个的用法搞错.仔细查看下API文档就可以知道.eq返回的是一个jquery对象,get返回的是一个html 对象数组.举个例子: <p style="color: ...
- 【XLL 框架库函数】 TempActiveCell/TempActiveCell12
这两个函数创建 XLOPER/XLOPER12 ,包含了当前激活工作表上的单元格引用. LPXLOPER TempActiveCell(WORD row, BYTE col); LPXLOPER12 ...
- 如何解决自动加载与模板中(如Smarty)的自动加载冲突的问题
function aotuman($class){ include('./'.$class.'.class.php'); } spl_autoload_register('automan'); / ...
- Python爬虫Scrapy框架入门(0)
想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题 ...
- 图像缩放_OpenCv
图像缩放是一种比较简单的图像处理操作,这里给出opencv中的代码, opencv的版本C语言接口 int resize_c() { const char *pstrImageName = " ...
- 复利计算--结对项目<04-11-2016> 1.0.0 lastest 阶段性完工~
结对项目:Web复利计算 搭档博客地址:25江志彬 http://www.cnblogs.com/qazwsxedcrfv/ 个人摘要: (2016-04-09-12:00)补充:之前传送门没做好, ...
- 欲望 VS 抗拒
总有很多事情在心里酝酿许久,但真要做起来却又很抗拒. 是在害怕,还是在逃避? 从心,快乐,都是这么难.
- Hibernate的一级缓存
Hibernate的一级缓存 什么是缓存:缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取 缓存的好处:提升程序运行的效率.缓存技术是Hibe ...
- Jquery AJAX ASP.NET IIS 跨域 超简单解决办法
第一种: 在IIS添加如下标头即可 Access-Control-Allow-Headers:Content-Type, api_key, AuthorizationAccess-Control-Al ...

