程序员如何做「安全编码」:不是可选项,是必选项
安全漏洞是系统被攻击的根本原因。
很多安全漏洞不是攻击者多厉害,是开发者写了不安全的代码。
一、常见的安全漏洞
1. SQL 注入
用户输入直接拼接到 SQL 语句中。
// 不安全
String sql = "SELECT * FROM users WHERE name = '" + name + "'";
// 安全:使用参数化查询
PreparedStatement ps = connection.prepareStatement(
"SELECT * FROM users WHERE name = ?"
);
ps.setString(1, name);
2. XSS(跨站脚本攻击)
用户输入直接渲染到页面上。
<!-- 不安全:用户输入当作 HTML 解析 -->
<div>{{userInput}}</div>
<!-- 安全:转义 HTML 特殊字符 -->
<div>{{userInput | escape}}</div>
3. CSRF(跨站请求伪造)
诱导用户访问恶意页面,自动发起攻击者指定的请求。
解决方案:CSRF Token、SameSite Cookie。
4. 敏感信息泄露
密码、密钥、用户信息没有加密或脱敏。
5. 权限绕过
没有校验用户权限,或者校验不完整。
二、安全编码原则
1. 输入校验
- 所有用户输入都不可信
- 服务端也要校验(不能只靠前端)
- 白名单校验优于黑名单
2. 参数化查询
所有数据库操作使用参数化查询。
3. 最小权限原则
数据库、文件系统的权限要最小化。
4. 敏感数据保护
- 加密存储
- 传输加密(HTTPS)
- 脱敏展示
5. 安全日志
记录安全相关的操作,便于审计。
三、安全工具
1. 扫描工具
- SonarQube:代码安全扫描
- Burp Suite:Web 渗透测试
- OWASP ZAP:自动化漏洞扫描
2. 依赖检查
- OWASP Dependency-Check
- Snyk
- npm audit
四、安全开发流程
1. 安全设计
架构设计阶段考虑安全。
2. 安全 Code Review
代码审查加入安全检查项。
3. 安全测试
- 静态代码分析
- 渗透测试
4. 安全监控
- 日志监控
- 异常检测
- 告警机制
五、一句话总结
安全编码 = 输入校验 + 参数化查询 + 最小权限 + 敏感数据保护 + 安全日志,核心是把安全当作开发的一部分。