阻止 SQL 注入攻擊對於維護 PHP 應用程式的安全至關重要。 SQL 注入是一個漏洞,允許攻擊者在您的資料庫上執行任意 SQL 程式碼,可能導致資料外洩或遺失。這是防止 PHP 中 SQL 注入攻擊的逐步指南,並附有實作範例和說明。
當使用者輸入未正確清理並合併到 SQL 查詢中時,就會發生 SQL 注入。例如,如果使用者輸入惡意 SQL 程式碼,它可能會操縱您的查詢來執行意外操作。
SQL 注入範例:
// Vulnerable Code $user_id = $_GET['user_id']; $query = "SELECT * FROM users WHERE id = $user_id"; $result = mysqli_query($conn, $query);
如果 user_id 設定為 1 OR 1=1,則查詢變成:
SELECT * FROM users WHERE id = 1 OR 1=1
此查詢將傳回 users 表中的所有行,因為 1=1 始終為 true。
準備好的語句是防禦 SQL 注入的關鍵。它們將 SQL 邏輯與資料分離,並確保使用者輸入被視為資料而不是可執行程式碼。
將 MySQLi 與準備好的語句結合使用:
$conn = new mysqli("localhost", "username", "password", "database"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); }
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id); // "i" indicates the type is integer
$user_id = $_GET['user_id']; $stmt->execute();
$result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // Process results }
$stmt->close(); $conn->close();
完整範例:
<?php // Database connection $conn = new mysqli("localhost", "username", "password", "database"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // Prepare statement $stmt = $conn->prepare("SELECT * FROM users WHERE id = ?"); if ($stmt === false) { die("Prepare failed: " . $conn->error); } // Bind parameters $user_id = $_GET['user_id']; $stmt->bind_param("i", $user_id); // Execute statement $stmt->execute(); // Get results $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo "User ID: " . $row['id'] . "<br>"; echo "User Name: " . $row['name'] . "<br>"; } // Close statement and connection $stmt->close(); $conn->close(); ?>
PHP 資料物件 (PDO) 提供類似的針對 SQL 注入的保護並支援多個資料庫系統。
將 PDO 與準備好的語句結合使用:
try { $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Connection failed: " . $e->getMessage()); }
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $user_id, PDO::PARAM_INT); $user_id = $_GET['user_id']; $stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "User ID: " . $row['id'] . "<br>"; echo "User Name: " . $row['name'] . "<br>"; }
完整範例:
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Prepare statement $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); // Bind parameters $user_id = $_GET['user_id']; $stmt->bindParam(':id', $user_id, PDO::PARAM_INT); // Execute statement $stmt->execute(); // Fetch results $results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "User ID: " . $row['id'] . "
"; echo "User Name: " . $row['name'] . "
"; } } catch (PDOException $e) { die("Error: " . $e->getMessage()); } ?>
阻止 SQL 注入攻擊對於保護 PHP 應用程式至關重要。將準備好的語句與 MySQLi 或 PDO 一起使用,您可以確保使用者輸入得到安全處理,而不是作為 SQL 查詢的一部分執行。遵循這些最佳實踐將有助於保護您的應用程式免受最常見的 Web 漏洞之一的影響。
以上是保護 PHP 應用程式免受 SQL 注入攻擊的詳細內容。更多資訊請關注PHP中文網其他相關文章!