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

PHP 安全郵件發送:防止 E-mail Header Injection 攻擊完整指南

     編輯:PHP 入門

PHP 安全郵件發送:防止 E-mail Header Injection 攻擊

PHP 內建的 mail() 函數雖然方便,但若未妥善驗證使用者輸入,極易遭受郵件標頭注入攻擊。本文詳細解析攻擊原理與防禦策略。

E-mail Header Injection 攻擊原理

典型的不安全郵件表單代碼:

<?php
if (isset($_REQUEST['email'])) {
    $email = $_REQUEST['email'];
    $subject = $_REQUEST['subject'];
    $message = $_REQUEST['message'];
    mail("admin@example.com", $subject, $message, "From: " . $email);
    echo "郵件發送成功";
}
?>

攻擊者可在 email 欄位輸入惡意字串:

attacker@example.com%0ACc:victim1@example.com%0ABcc:victim2@example.com,victim3@example.com%0ATo:victim4@example.com

由於 %0A 為換行符 URL 編碼,mail() 會將其解析為多個郵件標頭,導致郵件被發送至攻擊者指定的所有地址,淪為垃圾郵件發送器。

防禦策略:輸入驗證與過濾

核心原則:永遠不信任使用者輸入,嚴格驗證與過濾。

使用 PHP Filter 擴展進行驗證

<?php
function spamCheck($field) {
    // 移除非法字符
    $field = filter_var($field, FILTER_SANITIZE_EMAIL);
    // 驗證格式
    if (filter_var($field, FILTER_VALIDATE_EMAIL)) {
        return TRUE;
    }
    return FALSE;
}

if (isset($_REQUEST['email'])) {
    $mailCheck = spamCheck($_REQUEST['email']);
    if ($mailCheck === FALSE) {
        echo "非法輸入";
    } else {
        $email = $_REQUEST['email'];
        $subject = $_REQUEST['subject'];
        $message = $_REQUEST['message'];
        mail("admin@example.com", "Subject: $subject", $message, "From: $email");
        echo "感謝使用我們的郵件表單";
    }
}
?>

關鍵過濾器說明

  • FILTER_SANITIZE_EMAIL:移除字串中不合法的郵件字符(如換行符、多餘符號)
  • FILTER_VALIDATE_EMAIL:依據 RFC 822 標準驗證郵件格式有效性

進階防護建議

  1. 限制標頭字符:對所有用於郵件標頭的變數(From、Subject 等)進行換行符檢查與移除
  2. 使用成熟函式庫:推薦使用 PHPMailer、Symfony Mailer 等成熟函式庫,內建完善防護機制
  3. 實施速率限制:防止表單被自動化腳本濫發
  4. 驗證碼保護:加入 CAPTCHA 或 honeypot 欄位阻擋機器人
  5. 記錄與監控:記錄發送日誌,異常流量即時告警

安全郵件發送檢查清單

  • [ ] 所有使用者輸入經過 FILTER_SANITIZE_EMAIL 過濾
  • [ ] 郵件地址經過 FILTER_VALIDATE_EMAIL 驗證
  • [ ] Subject 欄位移除換行符 str_replace(["\r", "\n"], "", $subject)
  • [ ] 使用成熟郵件函式庫而非原生 mail()
  • [ ] 實施提交頻率限制
  • [ ] 郵件內容不包含未經過濾的使用者輸入

郵件安全不僅關乎應用程式信譽,更關乎伺服器 IP 信譽與郵件送達率。建立多層防護,從輸入端阻絕風險,是每位 PHP 開發者的必修課。

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