我是靠谱客的博主 娇气帽子,最近开发中收集的这篇文章主要介绍使用PrepareStatement,防止SQL注入,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

* 模拟sql注入,使用preparedstatment防止sql注入


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 模拟sql注入,使用preparedstatment防止sql注入
* @author 可敢离我近点
*
*/
public class SqlInjection {
public static void main(String[] args) {
/**
* 如果需要在finally块中手动关闭,就需要在try外声明
* 如果想要让其自动的关闭,则可以在try后面加一个括号初始化
* 先关闭statement,后关闭connection
* resultset结果集不需要手动关闭,他会在你关闭statement时自动的关闭
*/
Connection con=null;
PreparedStatement ps = null;
Statement st = null;
int i = 0;
//初始化驱动
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("数据库驱动加载成功...");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/xust?useUnicode=true&characterEncoding=utf-8&useSSL=false","root","mysql");
System.out.println("数据库连接成功...."+con);
System.err.println("sql 注入开始...................");
String name ="";
name = "'中国'
or 1=1";
String sql0 = "select * from area where name = "+name;
st = con.createStatement();
ResultSet rs0 = st.executeQuery(sql0);
while (rs0.next()&&i<15) {
String localname = rs0.getString("name");
System.out.println(localname);
i++;
}
System.out.println("********************************");
System.err.println("使用prepareStatement.....");
String sql ="select * from area where name = ?;";
ps = con.prepareStatement(sql);
ps.setString(1, name);
ResultSet rs = ps.executeQuery();
i = 0;
/**
* 此处无法查出任何的数据,是因为
* preparestatement语句会把name的整个字符串替换成?
* 相当于在数据库中查找name为
'中国'
or 1=1
的这一行数据
* 结果集当然会返回空
*/
while (rs.next()&&i<15) {
String localname = rs0.getString("name");
System.out.println(localname);
i++;
}
System.out.println("ok............");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if (null!=ps) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (null!=con) {
con.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("yes.............");
}
}
}

prepareStatement语句结果集为空的原因:
/** line : 60
* 此处无法查出任何的数据,是因为
* preparestatement语句会把name的整个字符串替换成?
* 相当于在数据库中查找name为 ‘中国’ or 1=1 的这一行数据
* 结果集当然会返回空
*/

最后

以上就是娇气帽子为你收集整理的使用PrepareStatement,防止SQL注入的全部内容,希望文章能够帮你解决使用PrepareStatement,防止SQL注入所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部