
1) 【一句话结论】
在360网络安全产品的API设计中,通过上下文敏感的输入验证(含路径参数校验)、输出编码(HTML/JSON分别处理)、安全框架配置(参数化查询、CSRF token、CSP)及细粒度权限控制(RBAC),从输入、处理、输出、权限全链路防护SQL注入、XSS、CSRF等攻击,同时针对盲注(错误处理+参数化)、存储型XSS(CSP+输出编码)等复杂场景制定工程化方案。
2) 【原理/概念讲解】
老师口吻解释关键概念:
/api/users/{id}的id)需验证为数字且在有效范围(如1-10000),防止路径注入(类比给路径参数装“数字过滤器”,只允许合法数字,阻止恶意路径);请求参数(如用户名、密码)用白名单(正则校验,如邮箱格式^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)或黑名单(过滤特殊字符,如<、>),限制输入合法范围。<→<),破坏XSS执行环境;JSON响应用JSON编码库(如Jackson的JsonEncoder)转义特殊字符,防止JSON XSS。Content-Security-Policy: default-src 'self'; script-src 'self'),限制资源加载来源。/api/users/delete,普通用户只能访问/api/users/profile),确保用户只能操作权限范围内的接口。3) 【对比与适用场景】
| 防护措施 | 定义 | 原理 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 路径参数验证 | 对URL路径中的参数(如id)进行类型和范围校验 | 限制参数为特定类型(数字/字符串)且在有效范围,过滤非法路径 | 路径参数作为查询条件(如/api/posts/{id}) | 需考虑业务逻辑(如id是否允许负数),避免遗漏边界 |
| 白名单输入验证 | 只允许符合预设规则的输入 | 限制输入内容,过滤非法字符 | 敏感字段(密码、邮箱、电话) | 规则需全面,避免遗漏合法输入;复杂规则可能增加维护成本 |
| 黑名单输入验证 | 过滤预设的非法字符或模式 | 过滤常见攻击字符(如<、>、&),简单高效 | 非敏感字段(用户输入的描述、备注) | 可能遗漏新攻击,需结合白名单 |
| 参数化查询(防SQL注入) | 使用预编译语句,将SQL和参数分离 | 数据库引擎处理参数,不会执行拼接的SQL | SQL查询、插入、更新操作 | 确保数据库驱动支持,避免动态拼接 |
| HTML输出编码 | 将HTML特殊字符转换为实体 | 破坏脚本执行环境,使浏览器将字符视为文本 | 响应内容为HTML页面 | 需处理所有HTML标签和属性 |
| JSON输出编码 | 用JSON编码库转义特殊字符 | 防止JSON响应中的恶意脚本执行 | 响应内容为JSON | 使用框架内置编码器(如Jackson) |
| CSRF Token | 请求中包含随机token,服务器验证 | 通过token验证请求是否来自合法源 | 需用户主动发起的请求(如POST表单) | token需随每个请求更新,session过期后重新生成 |
| CSP策略 | 限制资源加载来源 | 防止加载恶意脚本或样式 | 响应头配置CSP | 需根据业务调整策略,避免影响正常功能 |
| RBAC权限控制 | 基于角色的访问控制 | 根据角色分配权限,限制用户操作范围 | 需细粒度权限控制的应用 | 角色和权限配置需明确,避免越权 |
4) 【示例】
路径参数验证(防止路径注入):
请求:GET /api/users/123456(id为字符串“123456”,非法)
验证逻辑(伪代码):
// 路径参数id,验证为数字且在1-10000范围内
String idStr = request.getPathVariable("id");
if (!idStr.matches("\\d+") || Integer.parseInt(idStr) < 1 || Integer.parseInt(idStr) > 10000) {
return ResponseEntity.badRequest().body("无效的用户ID");
}
// 正常处理
解释:通过正则匹配数字,并限制范围,防止路径参数注入(如/api/users/'; DROP TABLE users;--)。
盲注检测(SQL注入):
请求:GET /api/users?username=admin' or '1'='1(盲注)
参数化查询逻辑(伪代码):
String sql = "SELECT COUNT(*) FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, request.getParameter("username"));
stmt.setString(2, request.getParameter("password"));
ResultSet rs = stmt.executeQuery();
// 盲注检测:通过错误处理判断结果是否为空或异常
if (rs.next() && rs.getInt(1) > 0) {
// 可能存在注入,进一步验证(如密码复杂度检查)
}
解释:参数化查询避免SQL拼接,但盲注可通过错误处理检测(如查询结果为空或异常,提示可能存在注入)。
存储型XSS防护(CSP+输出编码):
请求:用户输入HTML内容(如<script>alert(1)</script>)
服务器处理:
<script>alert(1)</script> → <script>alert(1)</script>Content-Security-Policy: default-src 'self'; script-src 'self';5) 【面试口播版答案】
“面试官您好,360网络安全产品的API安全防护,核心是通过输入端过滤、处理端编码、框架规则和权限控制,覆盖SQL注入、XSS、CSRF等常见攻击,同时针对复杂场景(如盲注、存储型XSS)有工程化方案。比如路径参数的数字范围验证,防止路径注入;对敏感字段用白名单(正则校验),非敏感用黑名单;SQL注入用参数化查询,XSS用HTML转义或JSON编码,CSRF用token+CSP,权限用RBAC。具体来说,输入验证分路径参数(如id必须是1-10000的数字),请求参数(如密码用白名单正则);输出编码HTML用实体转义,JSON用Jackson编码;框架配置Spring Security的CSRF拦截和CSP;权限控制根据角色分配API权限。这样从全链路降低攻击风险,比如路径参数验证能防止恶意路径注入,白名单能严格限制敏感输入,参数化查询彻底解决SQL注入,CSP和输出编码共同防护XSS,RBAC确保权限安全。”
6) 【追问清单】
request.getPathVariable()获取路径参数,用正则匹配类型(如数字),并限制范围(如1-10000),返回错误提示(如400 Bad Request),避免非法路径执行。Content-Security-Policy: default-src 'self'; script-src 'self';,限制脚本来源为自身,防止加载外部恶意脚本;结合HTML输出编码,确保用户输入内容安全。7) 【常见坑/雷区】
/api/users/'; DROP TABLE users;--),非法访问数据。+),导致合法输入被拒绝。script-src 'self'未限制,导致外部脚本加载,失效。