我最近发现 Django 电子商务网站存在一个严重的安全问题,用户可以在将商品添加到购物车之前修改商品价格。
许多开发人员允许用户从前端发送价格数据,可以使用 Burp Suite 或浏览器开发人员工具轻松篡改这些数据。
问题示例:
考虑一个将商品添加到购物车的简单 Django 视图:
def add_item(request):
product_id = request.GET.get('product_id')
price = request.GET.get('price') # User-controlled value (security risk)
qty = int(request.GET.get('qty', 1))
cart_item = {
'product_id': product_id,
'qty': qty,
'price': price, # This price comes from the user, not the database!
}
request.session['cart'] = request.session.get('cart', {})
request.session['cart'][product_id] = cart_item
request.session.modified = True
return JsonResponse({'message': 'Added to cart'})
攻击者如何利用此漏洞:
- 数据库中某产品的价格为500 美元。
- 用户点击“添加到购物车”。
- 攻击者没有发送原始价格,而是使用Burp Suite拦截请求。
- 该
price
字段更改为$1,并转发请求。 - 购物车现在存储了被操纵的价格,用户可以使用错误的金额继续结账。
这为何是一个安全风险?
- 后端信任来自前端的数据,但前端的数据很容易被操纵。
- 会话存储了错误的价格,导致财务损失。
- 攻击者可以通过修改请求数据以极低的价格购买昂贵的产品。
社区讨论要点:
- 防止这种情况的最佳做法是什么?
- 电子商务网站是否应该始终从数据库获取价格,而不是从前端接受价格?
- 开发人员在 Django 中处理购物车数据时还应该注意哪些其他漏洞?
很想听听你对此的想法!