• PerparedStatement防止SQL注入


    1. package com.lin.jdbc_04;
    2. import java.sql.Connection;
    3. import java.sql.PreparedStatement;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.sql.Statement;
    7. import java.util.Scanner;
    8. import com.lin.jdbc_01.JDBCUtils;
    9. /*
    10. * 模拟用户登录操作,判断登录是否成功
    11. * 分析:
    12. * user表,目前有两条数据
    13. * 1)键盘录入用户名和密码
    14. * 2)定义一个功能,isLogin(String username,String password)
    15. * 2.1)使用Statement对象进行查询
    16. * 通过username和password查询结果集和表中的数据对应上
    17. * 说明有具体的结果RequestSet里面next()
    18. * 2.2)如果返回值为true登录成功,否则登录失败
    19. *
    20. * */
    21. /*
    22. * *使用Statement对象查询sql语句
    23. *用户名和密码完全不一样:用户名和密码
    24. SELECT * FROM USER WHERE username='sdfsd' AND PASSWORD = 'a' OR 'a' = 'a';
    25. //String的sql拼接如果使用Statement就会造成"sql注入":不安全
    26. * sdfsd' AND PASSWORD = 'a' OR 'a' = 'a a=a 后面恒成立 (不安全)
    27. *
    28. *使用PerparesStatment:预编译对象 (推荐)
    29. * 1)执行预编译的sql语句,它的执行效率高
    30. * 2)能够有效防止sql注入,安全性更高!
    31. * Connection
    32. * PerparedStatement perpareStatment(String sql):
    33. * 将参数化的sql首先发送到数据库进行编译(编译一次)
    34. *参数化的sql语句
    35. * SELECT * FROM USER WHERE username= ? AND PASSWORD = ? ;
    36. * 给参数赋值
    37. * 第一个参数字符串类型:setString(1,username)
    38. * 第二个参数:字符串类型:setString(2,password) ;
    39. *
    40. * */
    41. public class PreparedStatementTest {
    42. public static void main(String[] args) {
    43. // 创建键盘录入对象
    44. Scanner sc = new Scanner(System.in);
    45. // 提示并录入数据
    46. System.out.println("请输入用户名");
    47. String username = sc.nextLine();
    48. System.out.println("请输入密码");
    49. String password = sc.nextLine();
    50. // 调用isLogin()
    51. boolean flag = isLogin2(username, password);
    52. if (flag) {
    53. System.out.println("登录成功");
    54. } else {
    55. System.out.println("登录失败");
    56. }
    57. }
    58. // 使用PreparedStatement执行预编译的SQL语句
    59. private static boolean isLogin2(String username, String password) {
    60. Connection conn = null ;
    61. PreparedStatement stmt = null ;
    62. ResultSet rs = null ;
    63. try {
    64. //注册驱动
    65. //获取连接对象
    66. conn = JDBCUtils.getConnection() ;
    67. //准备sql
    68. String sql = "select * from user where username = ? and password = ?;" ;
    69. //将参数的化的sql发送数据库,进行编译
    70. stmt = conn.prepareStatement(sql) ;
    71. System.out.println(sql);
    72. //参数进行赋值
    73. stmt.setString(1, username);
    74. stmt.setString(2, password);
    75. //执行sql
    76. rs = stmt.executeQuery() ;
    77. return rs.next() ;
    78. } catch (Exception e) {
    79. e.printStackTrace();
    80. }
    81. return false;
    82. }
    83. // 使用Statement中的静态sql语句
    84. private static boolean isLogin(String username, String password) {
    85. Connection conn = null;
    86. Statement stmt = null;
    87. ResultSet rs = null;
    88. // 注册驱动
    89. // 获取连接
    90. try {
    91. conn = JDBCUtils.getConnection();
    92. // 准备sql
    93. String sql = "select * from user where" + " username='" + username + "' and password = '" + password
    94. + "';";
    95. System.out.println(sql);
    96. // 通过连接对象创建执行对象
    97. stmt = conn.createStatement();
    98. // 执行查询
    99. rs = stmt.executeQuery(sql);
    100. return rs.next();// 如果通过用户名和密码查询到用户存在,光标就会向有效数据移动
    101. } catch (SQLException e) {
    102. // TODO Auto-generated catch block
    103. e.printStackTrace();
    104. } finally {
    105. // 释放资源
    106. JDBCUtils.close(rs, stmt, conn);
    107. }
    108. return false;
    109. }
    110. }

  • 相关阅读:
    完全透彻了解一个asp.net core MVC项目模板1
    [代码解读] A ConvNet for the 2020s
    C++:string类的常用接口说明及其模拟实现
    Linux利用源码包升级Nginx到1.23.1用以解决nginx安全漏洞问题
    arm LINUX 启动时间的一些优化项汇总
    2 万字 + 30 张图 | 细聊 MySQL undo log、redo log、binlog 有什么用?
    我所使用的生产 Java 17 启动参数
    Zookeeper实战、选举原理、分布式锁原理
    BAT030:按列表名单将路径a下的文件夹批量复制到路径b
    1 分钟 Serverless 搭建你的首个个人网站(完成就送猫超卡)
  • 原文地址:https://blog.csdn.net/weixin_57219176/article/details/126236726