• PreparedStatement 模拟并解决sql注入


    作用:

    预编译sql语句执行:预防sql注入问题

    sql注入:通过操作输入事先定义好的sql语句,用以达到执行代码达到对服务器进行攻击的方法

    我输入的信息为账号是随便输入的:fdadf,

    密码为 :' or'1'='1

    也登录成功了

    模拟一下sql注入

    1. import java.sql.Connection;
    2. import java.sql.DriverManager;
    3. import java.sql.ResultSet;
    4. import java.sql.Statement;
    5. import java.util.Scanner;
    6. public class Test5 {
    7. public static void main(String[] args) throws Exception{
    8. //我现在数据表中只有一个 数据 t_username='zhangsan' t_password='123';
    9. String url="jdbc:mysql:///TestUser";
    10. String userName="root";
    11. String PassWord="666";
    12. Connection con=DriverManager.getConnection(url, userName, PassWord);//创建连接
    13. Scanner sc=new Scanner(System.in);
    14. System.out.println("请您输入账号:");
    15. String username2=sc.nextLine();
    16. System.out.println("请您输入密码:"); //模拟sql注入 输入 ' or'1'='1
    17. String passwold2=sc.nextLine();
    18. String sql="select * from tb_user where t_username='"+username2+"'and t_password=+ '"+passwold2+"' ";
    19. Statement st=con.createStatement();
    20. ResultSet rs=st.executeQuery(sql);
    21. System.out.println(sql); //把他输出看看sql是啥
    22. if(rs.next()) {//如果有数据肯定就是查到了
    23. System.out.println("登录成功");
    24. }else {
    25. System.out.println("登录失败");
    26. }
    27. }
    28. }

    用Navicat打卡一下,主要是拼接出现了问题 

    select * from tb_user where t_username='fdadf'and t_password=+ ''or '1'='1' 

    解决sql注入

    1获取PrepareStatement对象

    Sql语句中的参数,使用?占位符代替

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

    通过Connection 对象获取,并传入对象的sql语句

    PreparedStatement ps=con.prepareStatement(sql);

    2设置参数值

    PrepareStatement对象:setXXX(参数1,参数2):给?赋值

    Xxx:数据类型  ;如setInt(参数1,参数2)

    参数:

    参数1:? 的位置编号 ,从1开始

    参数2: ?的值(变量)

    3执行sql

    executeUpdate()或者 executeQuery;不需要再传sql

    没有问题的登录

    1. package lib;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.PreparedStatement;
    5. import java.sql.ResultSet;
    6. import java.sql.Statement;
    7. import java.util.Scanner;
    8. public class Test7 {
    9. public static void main(String[] args) throws Exception {
    10. // TODO Auto-generated method stub//我现在数据表中只有一个 数据 t_username='zhangsan' t_password='123';
    11. String url="jdbc:mysql:///TestUser";
    12. String userName="root";
    13. String PassWord="666";
    14. Connection con=DriverManager.getConnection(url, userName, PassWord);//创建连接
    15. Scanner sc=new Scanner(System.in);
    16. System.out.println("请您输入账号:");
    17. String username2=sc.nextLine();
    18. System.out.println("请您输入密码:");
    19. String passwold2=sc.nextLine();
    20. String sql="select * from tb_user where t_username=?and t_password=?";
    21. PreparedStatement ps=con.prepareStatement(sql);//创建PrepareStatement对象
    22. //设置参数
    23. ps.setString(1, username2); //设置第一个问号
    24. ps.setString(2, passwold2); //设置第二个个问号
    25. ResultSet rs=ps.executeQuery(); //执行sql
    26. if(rs.next()) {//如果有数据肯定就是查到了
    27. System.out.println("登录成功");
    28. }else {
    29. System.out.println("登录失败");
    30. }
    31. }
    32. }

    PrepareStatement原理

    好处:

    预编译Sql,性能更高

    防止sql注入,将敏感字符进行转义

    1:PrepareStatement预编译功能开启:useServerPrepStmts=true ,在url中添加

    String url="jdbc:mysql:///TestUser?useServerPrepStmts=true";

    2配置Mysql执行日志(重启mysql服务器后生效) 配置到ini文件中

    1. log-output=FILE
    2. general-log=1
    3. general_log_file="D:/mysql.log"   
    4. show-query-log=1
    5. slow_query_log_file="D:\mysql_slow.log"
    6. long_query_time=2

    PrepareStatement原理:

    1在获取PrepareStatement对象时,将sql语句发送给mysql服务器,进行检查,编译(这些步骤很耗时)

    2执行时就不用再进行这些步骤了,速度更快

    3如果sql模板一样,则只需进行一次检查,,编译

  • 相关阅读:
    制作一个简单HTML静态网页(HTML+CSS)
    给根目录扩容
    KeenTune的算法之心——KeenOpt 调优算法框架 | 龙蜥技术
    https
    系统的去学习一门编程语言,原来有如此捷径
    在中国,为中国——西门子低代码精准助力本土企业数字化探索之路
    企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
    Visual Studio Code 安裝
    一篇文章学会【node.js安装以及Vue-Cli脚手架搭建】
    1. 前缀码判定
  • 原文地址:https://blog.csdn.net/m0_64365315/article/details/126101555