首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 安全核心原則:永不信任外部輸入,徹底清洗與驗證

     編輯:PHP 相關知識

Web 應用安全的第一鐵律:**所有非程式碼直接寫死的資料皆為「受汙染」**,必須經過清洗、驗證、轉義才能安全使用。

受汙染來源

  • 超全域變數:$_GET、$_POST、$_REQUEST、$_COOKIE、$_FILES、$_SERVER(部分)
  • 資料庫查詢結果
  • 設定檔、快取檔案、Session 資料
  • 第三方 API 回應
  • 使用者上傳檔案內容

危害範例

<?php
// 危險:直接使用 $_POST
$username = $_POST['username'];
$query = "SELECT * FROM users WHERE name = '$username'"; // SQL 注入
echo "Welcome $username"; // XSS
?>

防護三部曲

  1. 輸入驗證:確認格式、長度、範圍、型別。
    filter_var($email, FILTER_VALIDATE_EMAIL)、ctype_alnum($username)、strlen($pwd) >= 8。
  2. 資料清洗:移除/轉換不安全字元。
    htmlspecialchars($input, ENT_QUOTES, 'UTF-8')(輸出 HTML)、mysqli_real_escape_string()(SQL)、escapeshellarg()(Shell)。
  3. 輸出編碼:根據輸出語境編碼。
    HTML 體:htmlspecialchars();HTML 屬性:同前;JavaScript:json_encode();URL:urlencode();Shell:escapeshellarg()。

實務清洗函數範例

<?php
function cleanInput(string $input, int $maxLen = 64): string {
    $clean = trim($input);
    $clean = mb_substr($clean, 0, $maxLen, 'UTF-8');
    // 僅保留字母數字底線(視業務調整)
    $clean = preg_replace('/[^a-zA-Z0-9_]/u', '', $clean);
    return strtolower($clean);
}

// 使用
$username = cleanInput($_POST['username'] ?? '');
?>

進階防護

  • **預處理語句** 徹底解決 SQL 注入(PDO/MySQLi)。
  • **CSP (Content-Security-Policy)** 標頭緩解 XSS。
  • **檔案上傳**:驗證 MIME、副檔名、重新命名、存放非公開目錄、禁用腳本執行權限。
  • **CSRF Token** 保護狀態改變操作。
  • **最小權限原則**:資料庫帳號僅授必要權限;Web 目錄不可寫入執行檔。

安全非一次性工作,需貫穿開發、測試、部署、維運全生命週期。建立「不信任」心態,是寫出安全程式的起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved