码迷,mamicode.com
首页 > 数据库 > 详细

SQL注入问题的解决方案

时间:2016-01-01 20:57:29      阅读:368      评论:0      收藏:0      [点我收藏+]

标签:

一、产生及产生原因分析(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. }





SQL注入问题的解决方案

标签:

原文地址:http://www.cnblogs.com/didixyy/p/32337dc30134b1f2fab1ba7939ded5c1.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!