首页技术专题博客目录我的收藏关于与联系

安全意识的缺失:从 XSS 到 SQL 注入

项目上线后,被安全扫描发现了 20 多个漏洞。XSS、CSRF、SQL 注入,各种问题都有。花了 2 个月修复,这篇文章记录一下安全问题的发现和修复过程。

安全扫描的结果

项目上线前,做了安全扫描。结果发现了 20 多个漏洞:

  • XSS 漏洞:10 个
  • CSRF 漏洞:5 个
  • SQL 注入:3 个
  • 敏感信息泄露:2 个
  • 其他漏洞:若干

看到结果,我傻了。这么多漏洞,怎么修复?

XSS 漏洞

最严重的是 XSS 漏洞。用户输入的内容,直接渲染到页面上,没有转义。

比如评论功能,用户输入 <script>alert('XSS')</script>,直接显示在页面上,就会执行脚本。

我们用了 React,React 默认会转义,但有些地方用了 dangerouslySetInnerHTML,就绕过了转义。

修复方法:

  • 所有用户输入都要转义
  • 不要用 dangerouslySetInnerHTML,除非必要
  • 用 DOMPurify 清理 HTML
  • 设置 Content Security Policy

CSRF 漏洞

CSRF 漏洞也很严重。没有 CSRF token,攻击者可以伪造请求。

比如删除功能,攻击者可以构造一个链接,用户点击就删除了数据。

修复方法:

  • 所有修改操作都要 CSRF token
  • 用 SameSite cookie
  • 验证 Referer

SQL 注入

SQL 注入虽然不多,但很危险。有些地方直接拼接 SQL,没有用参数化查询。

比如搜索功能,用户输入 '; DROP TABLE users; --,就会删除表。

修复方法:

  • 所有 SQL 都用参数化查询
  • 不要直接拼接 SQL
  • 用 ORM,避免手写 SQL

敏感信息泄露

敏感信息泄露也很严重。API 返回了敏感信息,比如密码、token、密钥。

比如用户信息接口,返回了密码 hash。虽然不能直接看到密码,但还是有风险。

修复方法:

  • API 不要返回敏感信息
  • 日志不要记录敏感信息
  • 错误信息不要泄露系统信息

修复过程

花了 2 个月,修复了所有漏洞:

  1. 先修复高危漏洞,比如 SQL 注入、XSS
  2. 再修复中危漏洞,比如 CSRF、敏感信息泄露
  3. 最后修复低危漏洞,比如信息泄露

修复过程中,发现很多问题都是因为安全意识不够。开发时没考虑安全问题,上线后才发现。

安全规范

修复完漏洞,我们定了安全规范:

  • 所有用户输入都要验证和转义
  • 所有修改操作都要 CSRF token
  • 所有 SQL 都用参数化查询
  • API 不要返回敏感信息
  • 日志不要记录敏感信息
  • 定期做安全扫描

如果重新开始

如果重新做一个项目,我会:

  • 一开始就考虑安全问题,不要后面改
  • 做好输入验证和输出转义
  • 做好 CSRF 防护
  • 做好 SQL 注入防护
  • 定期做安全扫描

总结

安全问题很重要,但要提前考虑。如果上线后才发现,修复成本很高。

如果你们项目也有安全问题,建议先做安全扫描,找出所有漏洞。然后按优先级修复,高危的先修,低危的后修。

另外,安全意识要培养。开发时就要考虑安全问题,不要等出问题再处理。

评论区