• SQL注入与PreparedStatement对象


    SQL注入   

             sql存在漏洞,会被攻击导致数据泄露

    例:

            登录

    1. import java.sql.Connection;
    2. import java.sql.ResultSet;
    3. import java.sql.SQLException;
    4. import java.sql.Statement;
    5. public class SQLQuestion {
    6. public static void main(String[] args) {
    7. //正常登录
    8. // login("张三","1234567");
    9. //sql注入
    10. login("' or '1=1","123456");
    11. }
    12. /**
    13. * 登录业务
    14. */
    15. public static void login(String userName, String password) {
    16. Connection con = null;
    17. Statement st = null;
    18. ResultSet rs = null;
    19. try {
    20. con = JDBCUtils.getConnection();
    21. st = con.createStatement();
    22. String sql = "SELECT * FROM users WHERE `name`='"+userName+"' AND `password`='"+password+"'";
    23. // SELECT * FROM users WHERE `name`='' or '1=1' AND `password`='123456'
    24. System.out.println(sql);
    25. rs = st.executeQuery(sql);
    26. while (rs.next()) {
    27. System.out.println("id="+rs.getInt("id"));
    28. System.out.println("name="+rs.getString("name"));
    29. }
    30. } catch (SQLException e) {
    31. e.printStackTrace();
    32. } finally {
    33. JDBCUtils.release(con, st, rs);
    34. }
    35. }
    36. }

     

    PreparedStatement对象

            PreparedStatement可以防止SQL注入,效率更好

    例:

            新增

    1. import java.util.Date;
    2. import java.sql.Connection;
    3. import java.sql.PreparedStatement;
    4. import java.sql.SQLException;
    5. public class TestInsert {
    6. public static void main(String[] args) {
    7. Connection connection = null;
    8. PreparedStatement preparedStatement = null;
    9. try {
    10. connection = JdbcUtils.getConnection();
    11. // PreparedStatement 与 Statement 的区别
    12. //使用 ? 占位符替代
    13. String sql = "INSERT INTO users(`id`,`name`,`password`,`email`,`birthday`) VALUES (?,?,?,?,?)";//预编译,SQL,先写SQL,然后不执行
    14. preparedStatement = connection.prepareStatement(sql);
    15. //手动给参数赋值
    16. preparedStatement.setInt(1,4);
    17. preparedStatement.setString(2,"牛六");
    18. preparedStatement.setString(3,"123456");
    19. preparedStatement.setString(4,"niuliu@sina.com");
    20. preparedStatement.setDate(5, new java.sql.Date(new java.util.Date().getTime()));
    21. int num = preparedStatement.executeUpdate();
    22. if(num > 0){
    23. System.out.println("插入成功!");
    24. }
    25. } catch (SQLException e) {
    26. e.printStackTrace();
    27. }finally {
    28. JdbcUtils.release(connection,preparedStatement,null);
    29. }
    30. }
    31. }

            删除

    1. import java.sql.Connection;
    2. import java.sql.PreparedStatement;
    3. import java.sql.SQLException;
    4. public class TestDelete {
    5. public static void main(String[] args) {
    6. Connection con = null;
    7. PreparedStatement st = null;
    8. try {
    9. con = JdbcUtils.getConnection();
    10. String sql = "DELETE FROM users WHERE `id` = ?";
    11. st = con.prepareStatement(sql);
    12. st.setInt(1,5);
    13. int num = st.executeUpdate();
    14. if(num > 0){
    15. System.out.println("删除成功");
    16. }
    17. } catch (SQLException e) {
    18. e.printStackTrace();
    19. }finally {
    20. JdbcUtils.release(con,st,null);
    21. }
    22. }
    23. }

            更新

    1. import java.sql.Connection;
    2. import java.sql.PreparedStatement;
    3. import java.sql.SQLException;
    4. public class TestUpdate {
    5. public static void main(String[] args) {
    6. Connection con = null;
    7. PreparedStatement st = null;
    8. try {
    9. con = JdbcUtils.getConnection();
    10. String sql = "UPDATE users SET birthday=? WHERE id=?";
    11. st = con.prepareStatement(sql);
    12. st.setDate(1, new java.sql.Date(new java.util.Date().getTime()));
    13. st.setInt(2,1);
    14. int num = st.executeUpdate();
    15. if(num > 0){
    16. System.out.println("修改成功");
    17. }
    18. } catch (SQLException e) {
    19. e.printStackTrace();
    20. }finally {
    21. JdbcUtils.release(con,st,null);
    22. }
    23. }
    24. }

            查看

    1. import java.sql.Connection;
    2. import java.sql.PreparedStatement;
    3. import java.sql.ResultSet;
    4. import java.sql.SQLException;
    5. public class TestSelect {
    6. public static void main(String[] args) {
    7. Connection con = null;
    8. PreparedStatement st = null;
    9. ResultSet rs = null;
    10. try {
    11. con = JdbcUtils.getConnection();
    12. String sql = "select * from users where `id` = ?";
    13. st = con.prepareStatement(sql);
    14. st.setInt(1,1);
    15. rs = st.executeQuery();
    16. while (rs.next()){
    17. System.out.println("id="+ rs.getInt("id"));
    18. System.out.println("name="+ rs.getString("name"));
    19. }
    20. } catch (SQLException e) {
    21. e.printStackTrace();
    22. }finally {
    23. JdbcUtils.release(con,st,rs);
    24. }
    25. }
    26. }

    防止SQL注入(登录)

    1. import java.sql.*;
    2. public class SQL注入 {
    3. public static void main(String[] args) {
    4. //正常登录
    5. login("张三","123456");
    6. //SQL注入
    7. login("' or '1=1","123456");
    8. }
    9. public static void login(String userName,String password){
    10. Connection connection = null;
    11. PreparedStatement statement = null;
    12. ResultSet resultSet = null;
    13. try {
    14. connection = JdbcUtils.getConnection();
    15. // PreparedStatement 防止SQL注入的本质,把传递进来的参数当做字符
    16. // 假设其中存在转义字符,比如说'会被直接转义
    17. String sql = "SELECT * FROM users WHERE `name`=? AND `password`=?";
    18. // SELECT * FROM users WHERE `name`='' or '1=1' AND `password`='123456'
    19. // System.out.println(sql);
    20. statement = connection.prepareStatement(sql);
    21. statement.setString(1,userName);
    22. statement.setString(2,password);
    23. resultSet = statement.executeQuery();
    24. while (resultSet.next()){
    25. System.out.println("id="+resultSet.getInt("id"));
    26. System.out.println("name="+resultSet.getString("name"));
    27. System.out.println("=============");
    28. }
    29. } catch (SQLException e) {
    30. e.printStackTrace();
    31. }finally {
    32. JdbcUtils.release(connection,statement,resultSet);
    33. }
    34. }
    35. }

     

    小结:

            PreparedStatement 防止SQL注入的本质,把传递进来的参数当做字符

  • 相关阅读:
    Go-Python-Java-C-LeetCode高分解法-第十一周合集
    宇凡微Y62R射频433接收芯片(功能强大的合封解决方案)
    java毕业设计车位管理系统Mybatis+系统+数据库+调试部署
    医学图像 开源数据整理合集1
    产品经理基础--07用户端产品设计
    Java学生管理系统
    InfluxDB API -- InfluxDB笔记四
    笔记本电脑主板电池没电如何解决
    双十一客服培训话术
    【mysql篇-进阶篇】锁
  • 原文地址:https://blog.csdn.net/weixin_48426115/article/details/126285365