安全扫描的结果
项目上线前,做了安全扫描。结果发现了 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 个月,修复了所有漏洞:
- 先修复高危漏洞,比如 SQL 注入、XSS
- 再修复中危漏洞,比如 CSRF、敏感信息泄露
- 最后修复低危漏洞,比如信息泄露
修复过程中,发现很多问题都是因为安全意识不够。开发时没考虑安全问题,上线后才发现。
安全规范
修复完漏洞,我们定了安全规范:
- 所有用户输入都要验证和转义
- 所有修改操作都要 CSRF token
- 所有 SQL 都用参数化查询
- API 不要返回敏感信息
- 日志不要记录敏感信息
- 定期做安全扫描
如果重新开始
如果重新做一个项目,我会:
- 一开始就考虑安全问题,不要后面改
- 做好输入验证和输出转义
- 做好 CSRF 防护
- 做好 SQL 注入防护
- 定期做安全扫描
总结
安全问题很重要,但要提前考虑。如果上线后才发现,修复成本很高。
如果你们项目也有安全问题,建议先做安全扫描,找出所有漏洞。然后按优先级修复,高危的先修,低危的后修。
另外,安全意识要培养。开发时就要考虑安全问题,不要等出问题再处理。
评论区