Compra Procesada SEGURO
BLOQUEADO
Intento de Price Tampering neutralizado
Enviaste
Enviaste
price=1
pero el servidor uso el precio real de la BD: $299.990
Orden #DEMO
Precio verificado
| Producto | Nexo Enterprise |
|---|---|
| Cantidad | 1 |
| Precio unitario | $299.990 (de la BD) |
| Total | $299.990 |
| Precio que intentaste enviar |
|
¿Por que no funciono el ataque?
El codigo del servidor hace esto:
// procesar_secure.php (SEGURO)
// Solo acepta el product_id del cliente
$productId = $_POST['product_id']; // 3
// Obtiene el precio de la BASE DE DATOS
$product = getProductById($productId);
$amount = $product['price']; // $299.990 (de la BD)
// El campo "price" del POST se IGNORA COMPLETAMENTE
// $_POST['price'] = 1 <-- Ignorado
// Procesa el pago con el precio REAL
procesarPago($user, $amount);
Regla de oro:
Nunca confies en datos del cliente para calcular precios, descuentos,
totales o cualquier valor que afecte dinero.
Siempre calcula todo en el servidor usando datos de tu base de datos.
Request recibido
POST /a06_checkout/procesar_secure.php
product_id=3price=1 <-- IGNORADO
quantity=1
El campo
price fue ignorado.
El precio real vino de la BD.
Version Vulnerable
La version vulnerable SI acepta el precio del cliente:
Ahi SI va a cobrar $1.
Diferencia de diseno
procesar.php (INSECURE DESIGN)
// Confia en el cliente
$amount = $_POST['price'];
// Procesa con ese monto
procesarPago($user, $amount);
El cliente controla el precio. No hay forma de "parchear" esto - hay que redisenar.
procesar_secure.php (SECURE DESIGN)
// Obtiene de la BD
$product = getProduct($_POST['product_id']);
$amount = $product['price'];
// Procesa con precio real
procesarPago($user, $amount);
El servidor controla el precio. El cliente solo puede elegir QUE comprar, no A QUE PRECIO.