From 3d28569a02329086373dbc14bf49d12a879018be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=BE=E5=B3=B6=E9=A3=8E=E8=B5=B7=E6=99=82?= Date: Thu, 25 Sep 2025 04:00:42 +0800 Subject: [PATCH] Add files via upload --- Chapter21/21-1.md | 86 +++++++++++++++++++++++++++++++++++++++++++++ Chapter21/README.md | 19 ++++++++++ 2 files changed, 105 insertions(+) create mode 100644 Chapter21/21-1.md diff --git a/Chapter21/21-1.md b/Chapter21/21-1.md new file mode 100644 index 0000000..e8ee844 --- /dev/null +++ b/Chapter21/21-1.md @@ -0,0 +1,86 @@ +### JAVA 在做 SQL 注入防御时有哪些方法 + +**1. 使用预处理语句** + +这是 Java 中防御 SQL 注入最主要、最安全的方法。它与数据库通信时,会先发送 SQL 语句的模板,数据库编译好后,再将用户数据作为参数发送。这样,数据库只将数据视为数据,不会当作可执行的 SQL 命令 + +**JDBC 示例** + +```java +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class UserDAO { + + public void getUserData(String username) { + String sql = "SELECT * FROM users WHERE username = ?"; + + try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "user", "password"); + PreparedStatement pstmt = conn.prepareStatement(sql)) { + + // 1. 设置参数,将用户输入绑定到占位符 + pstmt.setString(1, username); + + // 2. 执行查询 + try (ResultSet rs = pstmt.executeQuery()) { + if (rs.next()) { + System.out.println("User found: " + rs.getString("username")); + } else { + System.out.println("User not found."); + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + } +} +``` + +- **核心:** 使用 `?` 作为占位符,然后通过 `pstmt.setString()`、`pstmt.setInt()` 等方法将用户输入绑定到这些占位符上 + +**2. 使用 ORM 框架** + +如果你使用 Java 生态系统中的主流框架,如 Spring Boot、Hibernate、MyBatis,那么 ORM 是首选。这些框架将面向对象编程与关系型数据库操作结合起来,从根本上消除了手动编写 SQL 的需要,从而自动防御 SQL 注入 + +**Hibernate 示例** + +```java +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.query.Query; +import com.example.model.User; + +public class UserRepository { + + private final SessionFactory sessionFactory; + + public User findByUsername(String username) { + try (Session session = sessionFactory.openSession()) { + // HQL (Hibernate Query Language) 示例 + // Hibernate 会自动处理参数绑定 + Query query = session.createQuery("from User where username = :username", User.class); + query.setParameter("username", username); + + return query.uniqueResult(); + } + } +} +``` + +- **核心:** Hibernate 等 ORM 框架在底层使用预处理语句来执行所有数据库操作,因此你不需要担心 SQL 注入问题 + +**3. 最小权限原则** + +这是一个重要的安全实践 + +- **不要使用数据库的管理员账户**(如 `root`)来运行应用程序 +- 为你的应用程序**创建专用的数据库用户**,并只授予其完成任务所需的最小权限。例如,一个只进行读取操作的服务,其数据库用户就应该只有 `SELECT` 权限 + +| 防御方法 | 优点 | 缺点 | 推荐度 | +| ---------- | ----------------------------------------------- | ---------------------------------------- | ---------------------- | +| 预处理语句 | 最安全、最彻底的防御;将数据与SQL代码分离。 | 需要手动编写SQL,语法略显繁琐。 | 最高 | +| ORM框架 | 从根本上杜绝SQL注入;开发效率高;代码可读性好。 | 需要学习框架;不适用于简单或无框架项目。 | 非常高 | +| 最小权限 | 降低攻击后的危害。 | 无法从根本上防御注入。 | 非常高(作为安全原则) | \ No newline at end of file diff --git a/Chapter21/README.md b/Chapter21/README.md index 8b13789..9eecb4f 100644 --- a/Chapter21/README.md +++ b/Chapter21/README.md @@ -1 +1,20 @@ +# 网安面试题(涵盖护网、红队、逆向、二进制) +上万道安全面试题已经全部为您划分好,适用于网络安全所有岗位!!! + +HR:请问………… + +我:叽里咕噜说啥呢,看看八股文上写了没 + +(Summary.md 是目录噢!!) + +**🙏 特别感谢名单** + +在整理和完善本项目的过程中,以下朋友给予了宝贵的帮助与支持,在此表示诚挚的感谢!(排名不分先后) + +- **@用户名1** —— 提供了大量安全面试题方向的补充 +- **@用户名2** —— 纠正了多个问题的答案与表述 +- **@用户名3** —— 贡献了真实面试题经验分享 +- **@用户名4** —— 对内容结构与目录提出改进建议 + +如果您也愿意参与本项目,欢迎通过 **微信: XR3327026244** 投稿面试题或反馈问题,我们会在后续版本中加入您的名字