从裸奔到安全:一次完整的 Web 应用安全加固实践

 

在当今互联网环境中,Web 应用面临着来自各方的安全威胁。从 SQL 注入到敏感信息泄露,从暴力破解到恶意扫描,每一个漏洞都可能成为攻击者的突破口。本文记录了一次对在线 AI 对话平台进行全面安全加固的完整过程,涵盖代码层面的漏洞修复到架构层面的安全升级。

一、直面问题:安全审计发现九大漏洞

项目最初的状态是"裸奔"式的部署——Java 后端直接暴露在公网,没有任何中间层保护。通过全面的安全审计,我们发现了以下关键问题:

SQL 执行器任意执行风险:系统内置的 SQL 执行器虽然需要密码验证,但登录后可以执行任何 SQL 语句,包括 DROP DATABASE 等毁灭性操作。管理员密码更是直接硬编码在源码中。

敏感信息明文暴露:数据库密码、阿里云 AccessKey、RabbitMQ 凭证全部以明文形式写在配置文件中,一旦代码泄露,所有密钥随之暴露。

认证体系形同虚设:Spring Security 配置为 `anyRequest().permitAll()`,所有接口无需认证即可访问。JWT 使用默认弱密钥,攻击者可以伪造任意用户身份。

用户隐私泄露:登录接口返回完整的用户对象,包括密码哈希值,这相当于主动将敏感数据交给攻击者。

二、代码层修复:逐一击破

针对上述问题,我们进行了系统性的代码修复。

SQL 执行器引入了危险语句黑名单机制,禁止执行 DROP、TRUNCATE、ALTER 等破坏性操作,同时设置 30 秒查询超时和 1000 行结果限制,防止资源耗尽攻击。管理密码改为通过环境变量注入,不再出现在源码中。

所有敏感配置统一改为环境变量方式读取,格式为 `${ENV_VAR:default_value}`。生产环境通过设置环境变量覆盖默认值,确保密钥不会随代码泄露。

AuthController 的响应数据经过精心筛选,只返回 id、name、nickname 等安全字段,彻底杜绝密码哈希泄露。同时添加了输入校验,防止超长输入导致的潜在攻击。

Actuator 端点从暴露 health、info、metrics 缩减为只暴露 health,并关闭详情显示,防止内部信息泄露。

三、架构升级:引入 Nginx 反向代理

代码层的修复只是治标,架构层的升级才是治本。我们引入了 Nginx 作为反向代理层,将原本"直连 Tomcat"的架构改为"Nginx 代理"模式。

这一改变带来了多重安全收益。首先是**后端隐藏**,Tomcat 不再直接监听公网端口,而是通过防火墙限制为仅允许本机访问。攻击者无法直接探测后端技术栈和漏洞。

其次是**请求过滤**,Nginx 作为第一道防线,可以在请求到达 Tomcat 之前进行限流、请求体大小限制等防护。WebSocket 连接也由 Nginx 统一管理,设置合理的超时时间。

此外,Nginx 还能直接返回静态资源,减轻 Tomcat 负担,减少攻击面。未来升级 HTTPS 时,证书配置也只需在 Nginx 层完成,后端无需改动。

四、部署实施:平滑过渡

由于项目已对外推广,访问链接不能变更。我们采用了"Nginx 监听 8080,后端退到 8081"的方案,确保用户访问地址 `http://服务器IP:8080` 保持不变,但流量已经过 Nginx 代理层。

部署过程遵循严格的顺序:先停 Java 释放端口,再启 Nginx 绑定 8080,最后启动新 Java 监听 8081。防火墙规则确保 8081 端口仅允许本机访问。

五、总结

安全加固不是一次性工作,而是持续的过程。本次改造从代码修复到架构升级,构建了多层次的安全防护体系。但安全之路远未结束,未来还需要考虑定期密钥轮换、WAF 部署、日志审计等更多措施。

对于每一个开发者而言,安全意识应当贯穿开发的始终。不要等到被攻击后才亡羊补牢,而应在设计之初就将安全纳入考量。毕竟,预防永远比补救更有效。

posted on 2026-08-03 02:48  溯衍  阅读(18)  评论(0)    收藏  举报