Django中对帖子浏览量统计端点使用@csrf_exempt是否安全?
关于帖子浏览量统计端点使用@csrf_exempt的安全性分析
直接给结论:不建议给这个端点加@csrf_exempt,原因和替代方案如下:
为什么不安全?
- 虽然当前逻辑只是给帖子浏览量+1,看似无风险,但恶意网站可通过诱导用户访问(比如嵌入隐藏请求)或直接批量发起请求刷假浏览量,破坏数据真实性,影响平台内容热度计算。
- 另外,一旦未来这个端点逻辑变更(比如新增和用户账号绑定的操作),@csrf_exempt会直接留下未授权操作的安全漏洞,后续维护容易踩坑。
更安全的替代方案
1. 改用GET请求
浏览量统计属于幂等性的统计操作,用GET请求更符合HTTP语义,而且GET请求天然不需要CSRF验证(浏览器同源策略和CSRF防护逻辑,主要针对会修改状态的POST/PUT/DELETE等请求)。
注意要点:
- 后端返回响应时设置禁止缓存的头,避免浏览器缓存请求导致统计不准:
response = HttpResponse(status=200) response["Cache-Control"] = "no-cache, no-store, must-revalidate" response["Pragma"] = "no-cache" response["Expires"] = "0" return response
2. 保留POST但不用@csrf_exempt
如果业务上必须用POST,前端可以从页面的meta标签里获取CSRF令牌,请求时放在X-CSRFToken请求头里,后端保持默认的CSRF验证即可:
- 页面meta标签:
<meta name="csrf-token" content="{{ csrf_token }}"> - 前端请求示例(用axios):
axios.post(`/posts/${slug}/view`, {}, { headers: { 'X-CSRFToken': document.querySelector('meta[name="csrf-token"]').content } })
3. 增加请求频率限制
不管用哪种请求方式,都要给这个端点加限流规则,比如限制同一个IP每分钟最多请求10次,从根源上防止批量刷量,保证浏览量数据的真实性。
内容的提问来源于stack exchange,提问作者Allen Ye
相关产品推荐
相关产品推荐

