SQL注入与jdbc操作详解

Posted gylionking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入与jdbc操作详解相关的知识,希望对你有一定的参考价值。

sql注入

由于没有对用户输入进行充分检查,而SQL又是拼接而成,在用户输入参数时,在参数中添加一些SQL 关键字,

达到改变SQL运行结果的目的,也可以完成恶意攻击。


示例:

在输入用户名时  tom' or '1'='1

这时就不会验证密码了。

解决方案:

PreparedStatement(重点)

它是一个预处理的Statement,它是java.sql.Statement接口的一个子接口。

总结PreparedStatement使用:

1.在sql语句中,使用"?"占位

String sql="select * from user where username=? and password=?";

2.得到PreparedStatement对象

PreparedStatement pst=con.prepareStatement(String sql);

3.对占位符赋值

pst.setXxx(int index,Xxx obj);

例如:

setInt()

setString();

参数index,代表的是"?"的序号.注意:从1开始。


4.执行sql

DML:  pst.executeUpdate();

DQL:   pst.executeQuery();

注意:这两方法无参数

关于PreparedStatement优点:

1.解决sql注入(具有预处理功能)

2.不需要在拼sql语句。


jdbc操作详解

1.注册驱动

DriverManager.registDriver(new Driver());

1.DriverManager类

它是java.sql包下的一个驱动管理的工具类,可以理解成是一个容器(Vector),可以装入很多数据库驱动

它的registDriver方法分析

 public static synchronized void registerDriver(java.sql.Driver driver)

 参数:java.sql.Driver

 我们传递的是  com.mysql.jdbc.Driver;

 

在com.mysql.jdbc.Driver类中有一段静态代码块:

static {

try {

java.sql.DriverManager.registerDriver(new Driver());

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

}

}

上述代码的问题:

1.在驱动管理器中会装入两个mysql驱动.

解决方案:使用反射

Class.forName("com.mysql.jdbc.Driver");

分析:使用反射的方式来加载驱动有什么好处?

1.只加载一次,装入一个驱动对象.

2.降低耦合,不依赖于驱动.

2.可以通过DriverManager来获取连接对象

Connection con=DriverManager.getConection(String url,String user,String password);

url作用:就是用于确定使用哪一个驱动.

mysql url:  jdbc:mysql://localhsot:3306/数据库名.

oralce url: jdbc:oracle:thin:@localhost:1521:sid

总结:DriverManager作用:

1.注册驱动

2.获取连接Connection

-----------------------------------------------------------

关于url

url格式

主协议  子协议   主机 端口  数据库

jdbc   :  mysql ://localhost:3306/day17

mysql的url可以简写:

前提:主机是localhost 端口是3306

jdbc:mysql:///day17

了解:在url后面可以带参数

useUnicode=true&characterEncoding=UTF-8

------------------------------------------------------------------

2.Connection详解

java.sql.Connection,它代表的是一个连接对象。简单说,就是我们程序与数据库连接。

Connection作用:

1.可以通过Connection获取操作sql的Statement对象。

Statement createStatement() throws SQLException

示例:

Statement st=con.createStatement();

了解:

1.可以获取执行预处理的PreparedStatement对象.

PreparedStatement prepareStatement(String sql) throws SQLException

2.可以获取执行存储过程的 CallableStatement

CallableStatement prepareCall(String sql) throws SQLException

2.操作事务

setAutoCommit(boolean flag);开启事务

rollback();事务回滚

commit();事务提交

------------------------------------------------------------------

3.Statement详解

java.sql.Statement用于执行sql语句.

Statement作用:

1.执行sql

DML:insert update delete

int executeUpdate(String sql)

利用返回值判断非0来确定sql语句是否执行成功。

DQL:select

ResultSet executeQuery(String sql)

可以通过execute方法来执行任何sql语句.

execute(String sql):用于向数据库发送任意sql语句


2.批处理操作

addBatch(String sql); 将sql语句添加到批处理

executeBatch();批量执行

clearBatch();清空批处理.

---------------------------------------------------------------------

4.ResultSet详解

java.sql.ResultSet它是用于封装select语句执行后查询的结果。

常用API

1.next()方法

public boolean next();

用于判断是否有下一条记录。如果有返回true,并且让游标向下移动一行。

如果没有返回false.

2.可以通过ResultSet提供的getXxx()方法来获取当前游标指向的这条记录中的列数据。

常用:

getInt()

getString()

getDate()

getDouble()

参数有两种

1.getInt(int columnIndex);

2.getInt(String columnName);

如果列的类型不知道,可以通过下面的方法来操作

getObject(int columnIndex);

getObject(String columnName);

----------------------------------------------------------------

5.关闭资源

Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。


特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。


为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。


以上是关于SQL注入与jdbc操作详解的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb - JDBC各个类详解工具类解决sql注入

JDBC详解

Java JDBC概要总结一(基本操作和SQL注入问题)

Java操作数据库(一,SQL注入与PreparedStatement)

jdbc_012_使用jdbc操作实现登录操作并且演示SQL注入攻击

[Js-JDBC]SQL注入及解决,Statement与PreparedStatement