java 如何防止攻击
防止常见攻击的方法
输入验证与过滤
对所有用户输入进行严格验证,包括长度、格式和内容。使用白名单机制,仅允许符合预期的字符和格式通过。避免直接拼接用户输入到SQL或HTML中。
防止SQL注入
使用预编译语句(PreparedStatement)替代字符串拼接SQL。参数化查询能有效隔离数据与指令,框架如MyBatis/Hibernate默认支持。
String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, userInput);
XSS防护
对输出到HTML的内容进行转义,使用库如OWASP Java Encoder或Spring的HtmlUtils。在HTTP头中设置Content-Security-Policy限制脚本来源。
String safeOutput = Encode.forHtml(userInput);
CSRF防御
启用同步令牌模式,框架如Spring Security提供内置支持。确保敏感操作需要携带随机生成的CSRF Token,并验证Referer头。

// Spring Security默认启用CSRF防护
@PostMapping("/transfer")
public String transferMoney(@RequestParam String amount) {
// 业务逻辑
}
安全配置与实践
HTTPS强制使用
配置服务器强制使用TLS 1.2+,通过Strict-Transport-Security头启用HSTS。避免混合内容,所有资源链接使用HTTPS。
权限最小化
应用运行使用低权限账户,数据库连接配置最小必要权限。定期审查权限设置,禁用默认账户和示例数据。

依赖库管理
通过Maven/Gradle检查依赖项的漏洞(如OWASP Dependency-Check)。及时更新已知漏洞的库版本,移除无用依赖。
日志与监控
敏感操作日志
记录关键操作(登录、数据修改)的详细信息,包括时间、用户和操作内容。避免日志中直接存储密码等敏感信息。
异常处理
自定义错误页面避免暴露堆栈信息,生产环境关闭调试模式。使用统一的异常处理器,避免系统信息泄露。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleError(Model model, Exception ex) {
model.addAttribute("message", "操作失败");
return "error"; // 返回通用错误页面
}
}
定期安全测试
使用工具(如Burp Suite、ZAP)进行渗透测试,执行代码审计。建立漏洞响应流程,及时修复发现的问题。






