An attacker should not be able to call add-cart.php 1000 times per second. Implement a token bucket or store a timestamp in the session:

$stmt = $conn->prepare("SELECT price, stock FROM products WHERE id = ? AND active = 1"); $stmt->bind_param("i", $product_id); $stmt->execute(); Principle 4: Implement CSRF Tokens Since you are modifying state (the cart), every request must include a unique token.

if (isset($_SESSION['last_cart_action']) && (time() - $_SESSION['last_cart_action']) < 0.5) header('HTTP/1.1 429 Too Many Requests'); exit;

Never trust user input. Always validate data types. Never use GET requests to modify state. And for the love of security, move away from raw add-cart.php scripts and toward modern, token-authenticated POST endpoints.

The attacker uses Burp Suite to fuzz the num parameter with a payload list: 1 , 1.1 , -1 , 999999 , 1 UNION SELECT 1 , 1%00 .

// In the form that calls add-cart $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); echo '<input type="hidden" name="csrf_token" value="'.$_SESSION['csrf_token'].'">'; // In add-cart.php if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) die('CSRF attack detected');