JDBC的SQL注入漏洞

ゝ一世哀愁。 2023-10-04 08:06 69阅读 0赞

在实现某些业务时,许多SQL语句中的参数都需要通过变量拼接而成,而这些参数大多都是通过用户输入而来,这样就存在了用户恶意输入SQL关键字来影响JDBC中SQL语句的查询。

例如最为常见的登录功能,我们通过用户输入的用户名和密码去检索数据库中的结果,如果存在则登录成功,若不存在则登录失败。

  1. Statement statement = connection.createStatement();
  2. String sql = "SELECT * FROM sys_user WHERE username = '" + username + "' AND password = '" + password + "'";
  3. ResultSet resultSet = statement.executeQuery(sql);

在这种写法中,如果用户恶意将用户名输入为'admin' or 1=1,无论password输入什么值,只要用户名正确都可以使得该SQL语句能够查询出结果。即拼接后的SQL语句为:

  1. SELECT * FROM sys_user WHERE username = 'admin' or 1 = 1 and password = 'alskdjfeo'

这样就可以在知道用户名的情况下随意登录系统。

因此可以使用PreparedStatement对象对SQL语句进行预编译,并使用占位符来替代要使用的参数,这样能够有效的防止SQL注入。

示例:

  1. package com.jdbc.test;
  2. import com.jdbc.utils.JDBCUtils;
  3. import org.junit.Test;
  4. import java.sql.Connection;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.Statement;
  8. public class JDBCTest {
  9. @Test
  10. public void login() {
  11. Connection connection = null;
  12. PreparedStatement statement = null;
  13. ResultSet resultSet = null;
  14. try {
  15. connection = JDBCUtils.getConnection();
  16. String sql = "select * from sys_user where username = ? and password = ?";
  17. statement = connection.prepareStatement(sql);
  18. statement.setString(1, "Jack");
  19. statement.setString(2, "123456");
  20. resultSet = statement.executeQuery();
  21. if (resultSet.next()) {
  22. System.out.println("登录成功");
  23. } else {
  24. System.out.println("登录失败");
  25. }
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. } finally {
  29. JDBCUtils.release(connection, statement, resultSet);
  30. }
  31. }
  32. }

发表评论

表情:
评论列表 (有 0 条评论,69人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JDBCSQL注入漏洞

    在实现某些业务时,许多SQL语句中的参数都需要通过变量拼接而成,而这些参数大多都是通过用户输入而来,这样就存在了用户恶意输入SQL关键字来影响JDBC中SQL语句的查询。 例

    相关 如何避免出现SQL注入漏洞

    简介: 本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案。