您的位置:首页 > 编程语言 > Java开发

JAVA-JDBC解决SQL注入问题

2020-03-01 09:26 417 查看

只要用户提供信息不参与SQL语句的编译过程,问题就解决了。
即使用户提供的信息中含有SQL语句的关键字,但是没有参与编译,不起作用。

PreparedStatement预操作

使用java.sql.PreparedStatement,其继承了java.sql.Statement
PreparedStatement是属于与编译的数据库操作对象。

import java.sql.*;

public class JDBCTest04 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost/test","root","xxx");

//3.获取数据库操作对象
// 其中一个?,表示一个占位符,一个?将来接受一个“值”,注意:占位符不能使用单引号括起来。
String sql = "SELECT * FROM t_user WHERE id = ? AND c_id =?";
ps = conn.prepareStatement(sql);
// 给占位符?传值
ps.setInt(1,2);
ps.setInt(2,101);
//4.执行sql
//excuteUpdate
rs = ps.executeQuery(); //专门执行DQL语句的方法
//5.处理查询结果
while (rs.next()){
String id = rs.getString("id");
String username = rs.getString("username");
String c_id = rs.getString("c_id");
System.out.println(id + "," + username + "," + c_id);
}

}catch (Exception e){
e.printStackTrace();
}finally {
if (rs != null){
try{
rs.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (ps != null){
try{
ps.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (conn != null){
try{
conn.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}

Statement和PreparedStatement对比

  • Statement存在SQL注入,PreparedStatement解决了SQL注入问题。
  • Statement是编译一次执行一次,PreparedStatement是编译一次,可执行N次。PreparedStatement效率更高。
  • PreparedStatement会在编译阶段做类型的安全检查。

综述:PreparedStatement使用情况较多。只有极少数的情况下需要使用Statement

什么情况下必须使用Statement

  • 业务方面要求必须支持SQL注入
  • statement支持SQL注入,凡是业务方面要求是需求进行SQL语句拼接的,必须使用statement。(例如在order by 后面加asc或者desc)
  • 点赞
  • 收藏
  • 分享
  • 文章举报
荆皎 发布了13 篇原创文章 · 获赞 3 · 访问量 2706 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐