
1) 【一句话结论】通过输入验证、参数化查询、内容编码、CSRF令牌等编码实践,结合静态/动态安全工具(如SonarQube、OWASP ZAP),可系统性防范SQL注入、XSS、CSRF等常见Web安全漏洞。
2) 【原理/概念讲解】老师可以解释每个漏洞的原理,避免空话:
3) 【对比与适用场景】
| 漏洞类型 | 定义 | 常见场景 | 核心解决方法 | 注意点 |
|---|---|---|---|---|
| SQL注入 | 用户输入绕过验证,注入恶意SQL代码到数据库查询 | 用户注册/登录/搜索等涉及数据库查询的接口 | 参数化查询(预编译语句) | 处理空值、参数类型(如setString/setInt),不同数据库差异 |
| XSS | 恶意脚本注入网页,在用户浏览器执行 | 用户评论、个人资料等用户可输入内容的页面 | 输出编码(HTML实体编码) | 防止DOM型攻击,需结合CSP |
| CSRF | 攻击者伪造用户请求,利用已登录会话 | 用户提交表单、修改设置等涉及会话的接口 | CSRF令牌(随机令牌)+ 同源策略 | GET请求不使用令牌,POST必须;验证请求来源Referer |
4) 【示例】
ObjectMapper mapper = new ObjectMapper();
try {
mapper.validate(jsonData); // 验证JSON结构合法性
JsonNode node = mapper.readTree(jsonData);
if (node.has("password")) {
node.remove("password"); // 脱敏密码字段
}
} catch (JsonProcessingException e) {
// 处理无效JSON
}
String sql = "SELECT * FROM users WHERE username = ? AND email = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);
stmt.setNull(2, Types.VARCHAR); // email为空时设置null
ResultSet rs = stmt.executeQuery();
// 前端
<form action="/change-password" method="post">
<input type="hidden" name="csrf_token" value="${session.csrfToken}">
<!-- 其他表单字段 -->
</form>
// 后端
String token = request.getParameter("csrf_token");
if (token == null || !token.equals(session.getAttribute("csrfToken"))) {
// 请求伪造,拒绝
}
5) 【面试口播版答案】
面试官您好,针对Web应用开发中的常见安全漏洞,核心是通过编码实践和工具辅助实现防御。首先SQL注入,关键是用参数化查询(预编译语句),比如Java的PreparedStatement,将用户输入作为参数传递,避免SQL结构被篡改。比如用户输入' or '1'='1,参数化查询会将其作为字符串处理,不会执行恶意SQL。然后XSS,核心是输出编码,比如将用户输入的<script>转为<script>,防止浏览器执行脚本。比如用户评论<script>alert('xss')</script>,输出后变成文本。接着CSRF,使用CSRF令牌,比如在表单中添加随机生成的token,后端验证是否与用户会话匹配。另外,对复杂输入(如JSON)用Jackson验证格式,确保数据合法。工具方面,用SonarQube配置SQL注入检测规则,或用OWASP ZAP动态测试。这样多维度防范,降低漏洞风险。
6) 【追问清单】
Content-Security-Policy: default-src 'self'。org.sonar.sqale.sqrl.sql_injection,并定期扫描代码。7) 【常见坑/雷区】
<script>标签,但忽略其他脚本注入方式(如onerror事件)。