Client-Side Price Storage and Manipulation
E-commerce applications that store prices, quantities, or discount information in client-side elements (HTML forms, JavaScript variables, cookies, or local storage) are vulnerable to direct manipulation by attackers who can modify these values to purchase items at arbitrary prices.
Preview example – HTML
<!-- VULNERABLE: Client-side price storage in HTML -->
<form id="checkout-form" action="/api/checkout" method="POST">
<div class="product-item">
<h3>Premium Laptop</h3>
<p class="price">$1299.99</p>
<!-- PROBLEM: Price stored in hidden form field -->
<input type="hidden" name="product_id" value="laptop-001">
<input type="hidden" name="price" value="1299.99">
<input type="hidden" name="currency" value="USD">
<label>Quantity:</label>
<input type="number" name="quantity" value="1" min="1">
<!-- VULNERABLE: Discount code applied client-side -->
<input type="hidden" name="discount_applied" value="false">
<input type="hidden" name="discount_amount" value="0">
</div>
<div class="cart-summary">
<p>Subtotal: <span id="subtotal">$1299.99</span></p>
<p>Tax: <span id="tax">$104.00</span></p>
<p>Total: <span id="total">$1403.99</span></p>
<!-- PROBLEM: Total calculation done client-side -->
<input type="hidden" name="final_total" id="final_total" value="1403.99">
</div>
<button type="submit">Complete Purchase</button>
</form>
<script>
// VULNERABLE: Price calculation in JavaScript
function applyDiscount(code) {
const discountCodes = {
'SAVE10': 0.10,
'EMPLOYEE50': 0.50, // PROBLEM: High-value discount exposed
'ADMIN99': 0.99 // PROBLEM: Admin discount accessible
};
const discount = discountCodes[code] || 0;
const price = parseFloat(document.querySelector('input[name="price"]').value);
const quantity = parseInt(document.querySelector('input[name="quantity"]').value);
// VULNERABLE: Client-side calculation
const subtotal = price * quantity;
const discountAmount = subtotal * discount;
const total = subtotal - discountAmount;
// PROBLEM: Trusting client-side calculations
document.getElementById('final_total').value = total.toFixed(2);
document.querySelector('input[name="discount_applied"]').value = 'true';
document.querySelector('input[name="discount_amount"]').value = discountAmount.toFixed(2);
}
// Attack scenarios:
// 1. Modify hidden price field: price="1" instead of "1299.99"
// 2. Apply admin discount codes found in JavaScript
// 3. Manipulate final_total directly: final_total="1.00"
// 4. Set negative quantities to get credits
// 5. Tamper with currency field to exploit exchange rate logic
</script>