在JDBC对数据库进行操作的时候,SQL注入是一种常见的针对数据库的注入攻击方式。如下面的代码所演示,在我们的提交字段中掺入了SQL语句,会使得程序的登录校验失效:

package org.lyk.main;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import org.apache.commons.dbcp2.BasicDataSource;

import org.omg.CORBA.PUBLIC_MEMBER;

import com.mysql.jdbc.DatabaseMetaData;

public class Main

{

public static String DBDRIVER = "com.mysql.jdbc.Driver";

public static String DB_URL = "jdbc:mysql://localhost:3306/mldn";

public static String USERNAME = "root";

public static String PASSWORD = "admin";

public static BasicDataSource bds = null;

public static void main(String[] args)

{

dbPoolInit();

System.out.println(verify("LIU YAN' -- ", "XXX"));

System.out.println("///Done~~~");

}

public static void dbPoolInit()

{

bds = new BasicDataSource();

bds.setDriverClassName(DBDRIVER);

bds.setUrl(DB_URL);

bds.setUsername(USERNAME);

bds.setPassword(PASSWORD);

}

public static boolean verify(String name, String password)

{

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

String sql = "SELECT COUNT(*) FROM user WHERE name='"+name+"' and password='"+password+"';";

System.out.println(sql);

boolean retVal = false;

try

{

conn = bds.getConnection();

stmt = conn.createStatement();

rs = stmt.executeQuery(sql);

if(rs.next() && rs.getInt(1) == 1)

{

retVal = true;

}

//System.out.println(rs.getInt(1));

} catch (SQLException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

finally

{

try

{

if(conn != null )

conn.close();

if(stmt != null)

stmt.close();

if(rs != null)

rs.close();

}

catch(Exception exception)

{

//ignore all exceptions when closing...

}

}

return retVal;

}

}

为了解决这个问题,可以使用PreparedStatement来防止该类型的攻击。

其演示代码如下:

package org.lyk.main;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import org.apache.commons.dbcp2.BasicDataSource;

public class Main

{

public static String DBDRIVER = "com.mysql.jdbc.Driver";

public static String DB_URL = "jdbc:mysql://localhost:3306/mldn";

public static String USERNAME = "root";

public static String PASSWORD = "admin";

public static BasicDataSource bds = null;

public static void main(String[] args)

{

dbPoolInit();

System.out.println(verify("LIU YAN' -- ", "XXX"));

System.out.println("///Done~~~");

}

public static void dbPoolInit()

{

bds = new BasicDataSource();

bds.setDriverClassName(DBDRIVER);

bds.setUrl(DB_URL);

bds.setUsername(USERNAME);

bds.setPassword(PASSWORD);

}

public static boolean verify(String name, String password)

{

Connection conn = null;

PreparedStatement stmt = null;

ResultSet rs = null;

String sql = "SELECT COUNT(*) FROM user WHERE name=? and password=? ;";

System.out.println(sql);

boolean retVal = false;

try

{

conn = bds.getConnection();

stmt = conn.prepareStatement(sql);

stmt.setString(1, name);

stmt.setString(2, password);

rs = stmt.executeQuery();

if(rs.next() && rs.getInt(1) == 1)

{

retVal = true;

}

//System.out.println(rs.getInt(1));

} catch (SQLException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

finally

{

try

{

if(conn != null )

conn.close();

if(stmt != null)

stmt.close();

if(rs != null)

rs.close();

}

catch(Exception exception)

{

//ignore all exceptions when closing...

}

}

return retVal;

}

}

JDBC中的PreparedStatement-防止SQL注入攻击的更多相关文章

  1. 在JDBC中使用PreparedStatement代替Statement,同时预防SQL注入

    本篇讲诉为何在JDBC操作数据库的过程中,要使用PreparedStatement对象来代替Statement对象. 在前面的JDBC学习中,对于Statement对象,我们已经知道是封装SQL语句并 ...

  2. Java学习笔记47(JDBC、SQL注入攻击原理以及解决)

    JDBC:java的数据库连接 JDBC本质是一套API,由开发公司定义的类和接口 这里使用mysql驱动,是一套类库,实现了接口 驱动程序类库,实现接口重写方法,由驱动程序操作数据库 JDBC操作步 ...

  3. JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务

    JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...

  4. 【JDBC】学习路径3-密码登录&SQL注入攻击

    最后再提醒一句,每次在测试JDBC程序的时候,一定要确保MySQL正在运行. 打开控制台(终端),输入mysql 如果没启动,则出现以下提示: Mac端启动MySQL数据库,需要在系统便好设置中启动. ...

  5. 回头探索JDBC及PreparedStatement防SQL注入原理

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...

  6. jdbc之防sql注入攻击

    1.SQL注入攻击:    由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执 ...

  7. JDBC及PreparedStatement防SQL注入

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...

  8. ASP.NET中的SQL注入攻击与防护

    什么是SQL注入攻击? 它是在执行SQL查询的时候,由于接收了用户的非法参数从而导致,所执行的SQL语义与业务逻辑原本所要查询的语义不相符,从而实现的攻击. 例如我们经常使用的用户登录,通常会出现这样 ...

  9. Java应用开发中的SQL注入攻击

    1. 什么是SQL注入攻击? SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员越来越多.但是由于程序员的水平及经验参差不齐,相当一部分 ...

随机推荐

  1. Swagger-UI 基于REST的API测试/文档类插件

    现在多数的项目开发中,网站和移动端都需要进行数据交互和对接,这少不了使用REST编写API接口这种场景.例如我目前的工作,移动端交由了另一团队开发,不同开发小组之间就需要以规范和文档作为标准和协作基础 ...

  2. android中的TextView控件

    我以前是搞ssh开发的,现在在搞android开发,所以简单学习了一下,对于自己所了解的做一个记录,也算是一个笔记吧,如果有什么不对的,希望大家给予一定的指导.  一.TextView的基本使用 Te ...

  3. tomcat如何按站点调试本机程序

    1.配置host host地址:c:\windows\system32\drivers\etc 配置本机域名: # localhost name resolution is handled withi ...

  4. jquery读取csv文件并用json格式输出

    直接贴上代码: <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Untit ...

  5. Verilog杂谈

    1. Testbech总是用reg去驱动DUT的input端口,因为需要在仿真期间设置和保持输入端的值(例如在initial中设置初值,在always中设置激励值): 2. 避免对局部reg在定义时赋 ...

  6. golang一个深复制的库

    https://github.com/mitchellh/copystructure

  7. 从IT匹配业务如何走向IT引领业务

    http://mp.weixin.qq.com/s?__biz=MjM5Njk2Mzg0MQ==&mid=200105892&idx=1&sn=cd9c155d09e8b975 ...

  8. Ubuntu下面配置问题

    下开启root登陆 sudo passwd root 输入两次新密码 就能在虚拟终端下用 root登陆了,或者 su到root用户了. ctrl + alt +t 弹出终端 ctrl+ alt+ f7 ...

  9. 使用 HTML5 Shiv 让 IE 支持 HTML5

    HTML5 Shiv 使用 html5.js 必须在页面head元素内调用(因为 IE 必须在元素解析前知道这个元素,所以这个 JS 文件不能在页面底部调用.) 作者已经把js文件放在Google c ...

  10. Linux大文件传输(转)

    我们经常需要在机器之间传输文件.比如备份,复制数据等等.这个是很常见,也是很简单的.用scp或者rsync就能很好的完成任务.但是如果文件很大,需要占用一些传输时间的时候,怎样又快又好地完成任务就很重 ...