Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 449|回复: 0

SQL注入问题的解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-1 10:19:32 | 显示全部楼层 |阅读模式
    一、产生及产生原因分析(sql语句进行拼串的原因)
    分析:
      
      
    1. String sql = "select * from user where username='"+username+"' and password='"+password+"'";
    2. String sql = "select * from user where username='tom' and password='123'";
    3. select * from user where username='jerry' and password='abc'//这种情况是不会有问题的
    4. //测试如果传入的是SQL语句的的一部分
    5. username:tom' or '1'='1
    6. password:????????
    7. //这时候的SQL语句为一下这种情况
    8. select * from user where username='tom' or '1'='1' and password='?????'
    9. //由于and的执行优先级大于Or 可以看作以下情况
    10. select * from user where username='tom' or ('1'='1' and password='?????');
    11. //由于是or 或者的关系这时的SQL语句可以看作是这样的语句
    12. select * from user where username='tom'

    二、解决方案(引入: PreparedStatement对象,使SQL语句进行预编译
    PreparedStatement pstmt = conn.perpareStatement(String sql);
    其实statement执行executeQuery内部分为两步:
    第一步:编译sql 
    第二步:执行sql
    优点:能预编译sql语句
    例子:数据库客户端服务端基本模型
    登陆端
       
       
    1. package com.heima.login.client;
    2. import java.util.Scanner;
    3. import com.heima.login.bean.User;
    4. import com.heima.login.seriver.services;
    5. public class login {
    6. /**
    7. * @param args
    8. * @throws Exception
    9. */
    10. public static void main(String[] args) throws Exception {
    11. // TODO Auto-generated method stub
    12. // 创建Scanner接收输入内容
    13. Scanner sc= new Scanner(System.in);
    14. System.out.println("请输入用户名");
    15. String username = sc.nextLine();
    16. System.out.println("请输入密码");
    17. String password = sc.nextLine();
    18. // 创建服务端对象使用登陆方法
    19. services s=new services();
    20. User user = s.login(username, password);
    21. if(user!=null){
    22. System.out.println(user);
    23. }else{
    24. System.out.println("用户名或密码错误!!!");
    25. }
    26. }
    27. }
    服务端:
        
        
    1. package com.heima.login.seriver;
    2. import java.sql.Connection;
    3. import java.sql.PreparedStatement;
    4. import java.sql.ResultSet;
    5. import com.heima.Tools.JdbcConnection;
    6. import com.heima.login.bean.User;
    7. public class services {
    8. public User login(String username,String password) throws Exception
    9. {
    10. //新建user引用,默认值问null
    11. User u=null;
    12. //使用自定义数据库连接工具类进行数据库连接
    13. Connection conn=JdbcConnection.getConnection();
    14. //创建预编译数据库连接语句
    15. String sql = "select * from user where username=? and password=?";
    16. //创建PreparedStatement对象对数据库语句进行预编译
    17. PreparedStatement stem=conn.prepareStatement(sql);
    18. //设置预编译语句中的查询值
    19. stem.setString(1, username);
    20. stem.setString(2, password);
    21. //执行SQL语句
    22. ResultSet rs=stem.executeQuery();
    23. //如果有记录对User对象进行赋值
    24. if(rs.next())
    25. {
    26. u = new User();
    27. u.setAge(rs.getInt("age"));
    28. u.setDept(rs.getString("Dept"));
    29. u.setEmail(rs.getString("email"));
    30. u.setGender(rs.getString("gender"));
    31. u.setId(rs.getInt("id"));
    32. u.setPassword(rs.getString("password"));
    33. u.setRegistTime(rs.getDate("registTime"));
    34. u.setSalary(rs.getDouble("salary"));
    35. u.setUsername(rs.getString("username"));
    36. }
    37. //关闭数据库资源
    38. JdbcConnection.close(conn, stem, rs);
    39. return u;
    40. }
    41. }

    User对象:
       
       
    1. package com.itheima.login.entity;
    2. public class User {
    3. private int id;
    4. private String username;
    5. private String password;
    6. private String email;
    7. public int getId() {
    8. return id;
    9. }
    10. public void setId(int id) {
    11. this.id = id;
    12. }
    13. public String getUsername() {
    14. return username;
    15. }
    16. public void setUsername(String username) {
    17. this.username = username;
    18. }
    19. public String getPassword() {
    20. return password;
    21. }
    22. public void setPassword(String password) {
    23. this.password = password;
    24. }
    25. public String getEmail() {
    26. return email;
    27. }
    28. public void setEmail(String email) {
    29. this.email = email;
    30. }
    31. @Override
    32. public String toString() {
    33. return "User [id=" + id + ", username=" + username + ", password="
    34. + password + ", email=" + email + "]";
    35. }
    36. }





    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-23 12:00 , Processed in 0.060834 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表