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

PHP 資料入庫與出庫安全處理全攻略:防注入、防 XSS、編碼轉換

     編輯:PHP 綜合知識

核心原則

  • 入庫: 防 SQL 注入(參數化查詢/轉義)、去除首尾空白。
  • 出庫: 還原轉義字元。
  • 顯示: 防 XSS(htmlspecialchars)、換行轉 <br>。

現代最佳實踐:PDO 參數化查詢(推薦)

<?php
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 入庫:參數化查詢,完全防注入
$stmt = $pdo->prepare("INSERT INTO `tab` (`content`) VALUES (:content)");
$stmt->execute([':content' => $str]);

// 出庫:直接取得原始字串,無需 stripslashes
$stmt = $pdo->prepare("SELECT `content` FROM `tab` WHERE id = :id");
$stmt->execute([':id' => $id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$content = $row['content'];

// 顯示:防 XSS + 換行處理
echo nl2br(htmlspecialchars($content, ENT_QUOTES, 'UTF-8'));
?>

傳統 mysql_* / mysqli 轉義方案(舊專案維護用)

<?php
// 入庫
$str = trim($str);                           // 去首尾空白
$str = mysqli_real_escape_string($link, $str); // 轉義特殊字元
$sql = "INSERT INTO `tab` (`content`) VALUES ('$str')";

// 出庫
$str = stripslashes($str); // 若 magic_quotes_gpc=On 需還原

// 顯示
echo nl2br(htmlspecialchars($str, ENT_QUOTES, 'UTF-8'));
?>

常見工具函式整理(舊碼參考)

<?php
// 標題/名稱類:去空白、雙單引號轉義
function trans_string_trim($str) {
    $str = trim($str);
    $str = str_replace("'", "''", $str); // SQL 標準轉義:單引號變兩個單引號
    return $str;
}

// 文章/textarea 類:同前,但保留內部空白
function trans_string($str) {
    $str = str_replace("'", "''", $str);
    return $str;
}

// 顯示在網頁:防 XSS、換行轉 br、可選是否保留空格
function trans_web($string, $keepSpaces = false) {
    $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
    $string = nl2br($string);
    if (!$keepSpaces) {
        $string = str_replace(' ', ' ', $string); // 或移除多餘空白
    }
    return $string;
}

// 表單 value 顯示:需雙重編碼防破壞屬性
function trans_form_value($str) {
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

// Cookie 讀取:還原魔術引號 + 防 XSS
function trans_cookie($str) {
    if (get_magic_quotes_gpc()) $str = stripslashes($str);
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>

關鍵提醒

  1. 棄用 addslashes/eregi_replace: 不支援多位元組字元,易繞過;eregi_* 系列 PHP 7 已移除。
  2. 統一使用 UTF-8: 資料庫、連線、HTML 頁面、PHP 檔案編碼全鏈路 UTF-8(charset=utf8mb4)。
  3. 關閉 magic_quotes_gpc: PHP 5.4+ 已移除,舊版請在 php.ini 關閉。
  4. 輸出時才編碼: 資料庫儲存原始資料,輸出到 HTML/JS/JSON/CSS 時才做對應編碼(htmlspecialchars/json_encode/addslashes 等)。
  5. 內容安全政策 (CSP): 配合 HTTP Header Content-Security-Policy 纵深防禦 XSS。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved