保護您的PHP 應用程式涉及保護其免受常見漏洞的影響,例如SQL 注入、跨站點腳本(XSS)、跨站點請求偽造(CSRF)、會話劫持和文件包含攻擊。這是一個帶有逐部分描述的實踐範例,可幫助您了解如何保護 PHP 應用程式。
當攻擊者可以將惡意 SQL 語句注入您的查詢時,就會發生 SQL 注入。將準備好的語句與參數化查詢一起使用可以避免這種情況。
範例:
<?php // Insecure version $user_id = $_GET['id']; $query = "SELECT * FROM users WHERE id = '$user_id'"; $result = mysqli_query($connection, $query); // Secure version $user_id = $_GET['id']; $stmt = $connection->prepare("SELECT * FROM users WHERE id = ?"); $stmt->bind_param("i", $user_id); // "i" for integer $stmt->execute(); $result = $stmt->get_result(); ?>
說明:
當攻擊者將惡意腳本注入其他使用者檢視的網頁時,就會發生 XSS。為了避免這種情況,請始終對輸出進行清理和編碼。
範例:
<?php // Insecure version echo "<p>Welcome, " . $_GET['username'] . "</p>"; // Secure version echo "<p>Welcome, " . htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8') . "</p>"; ?>
說明:
當攻擊者誘騙使用者在使用者不知情的情況下在網站上執行操作時,就會發生 CSRF。透過使用令牌來防止CSRF。
範例:
<?php // Generate CSRF token session_start(); if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // Add token to form echo '<form method="POST" action="submit.php">'; echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">'; echo '<input type="text" name="data">'; echo '<input type="submit" value="Submit">'; echo '</form>'; ?>
在submit.php中:
<?php session_start(); if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die("CSRF token validation failed."); } // Process form data $data = $_POST['data']; ?>
說明:
保護您的會話以避免會話劫持。這包括設定嚴格的會話配置和重新產生會話ID。
範例:
<?php session_start(); // Regenerate session ID to avoid fixation attacks session_regenerate_id(true); // Configure secure session parameters ini_set('session.cookie_httponly', 1); // Prevent JavaScript access to session cookies ini_set('session.cookie_secure', 1); // Ensure cookies are sent over HTTPS ini_set('session.use_strict_mode', 1); // Prevent accepting uninitialized session IDs // Set session timeout $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time if (time() - $_SESSION['LAST_ACTIVITY'] > 1800) { // 30 minutes timeout session_unset(); session_destroy(); session_start(); } ?>
說明:
不受限制的檔案上傳可能會導致惡意檔案上傳並執行。始終驗證文件類型並安全地儲存它們。
範例:
<?php // Insecure version $user_id = $_GET['id']; $query = "SELECT * FROM users WHERE id = '$user_id'"; $result = mysqli_query($connection, $query); // Secure version $user_id = $_GET['id']; $stmt = $connection->prepare("SELECT * FROM users WHERE id = ?"); $stmt->bind_param("i", $user_id); // "i" for integer $stmt->execute(); $result = $stmt->get_result(); ?>
說明:
CSP 標頭可以透過限制資源載入位置來幫助防止 XSS 和資料注入攻擊。
範例(要加入 .htaccess 檔案或伺服器設定):
<?php // Insecure version echo "<p>Welcome, " . $_GET['username'] . "</p>"; // Secure version echo "<p>Welcome, " . htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8') . "</p>"; ?>
說明:
使用輸入驗證和清理來防止各種類型的注入。
範例:
<?php // Generate CSRF token session_start(); if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // Add token to form echo '<form method="POST" action="submit.php">'; echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">'; echo '<input type="text" name="data">'; echo '<input type="submit" value="Submit">'; echo '</form>'; ?>
說明:
透過實作這些方法,您的 PHP 應用程式將得到更好的保護,免受常見漏洞的影響。保持最新的最佳實踐並對您的程式碼持續應用安全措施非常重要。
與我聯絡:@ LinkedIn 並查看我的作品集。
請給我的 GitHub 專案一顆星 ⭐️
以上是保護您的 PHP 應用程式免受常見漏洞影響的基本安全實踐的詳細內容。更多資訊請關注PHP中文網其他相關文章!