Recentemente, descobri um sério problema de segurança nos sites de comércio eletrônico Django, onde os usuários podem modificar os preços dos produtos antes de adicioná-los ao carrinho.
Muitos desenvolvedores permitem que os usuários enviem dados de preços do frontend , que podem ser facilmente adulterados usando o Burp Suite ou ferramentas de desenvolvedor do navegador .
Exemplo do problema:
Considere uma visualização simples do Django que adiciona itens ao carrinho:
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'})
Como um invasor pode explorar isso:
- Um produto custa US$ 500 no banco de dados.
- O usuário clica em "Adicionar ao carrinho" .
- Em vez de enviar o preço original, o invasor intercepta a solicitação usando o Burp Suite .
- O
price
campo é alterado para $1 e a solicitação é encaminhada. - O carrinho agora armazena o preço manipulado , e o usuário pode prosseguir para a finalização da compra com o valor errado.
Por que isso é um risco à segurança?
- O backend confia nos dados do frontend , que podem ser facilmente manipulados .
- A sessão armazena o preço errado , levando a perdas financeiras .
- Os invasores podem comprar produtos caros a preços extremamente baixos modificando os dados da solicitação.
Pontos de discussão para a comunidade:
- Quais são as melhores práticas para evitar isso?
- Os sites de comércio eletrônico devem sempre buscar preços no banco de dados em vez de aceitá-los do frontend?
- De quais outras vulnerabilidades os desenvolvedores devem estar cientes ao manipular dados de carrinho no Django?
Adoraria saber sua opinião sobre isso!