隨著互聯網的發展,基於PHP的網站仍然佔據大量應用場景。由於PHP的靈活性與普及性,不安全的寫法容易被攻擊者利用。本文以實戰角度介紹幾類常見漏洞的利用方式與防禦思路,並保留示例代碼以便理解與修復(代碼塊盡量保持原樣,僅清理了混亂的HTML結構)。文中已去除與站點推廣或內部鏈接相關的信息。
描述:攻擊者通過把惡意SQL片段注入到輸入中,改變原有查詢邏輯,從而繞過驗證或竊取/篡改數據。
<?php
$id = $_GET['id'];
// 拼接 SQL 查詢語句
$sql = "SELECT * FROM users WHERE id = " . $id;
// 執行查詢
$result = mysqli_query($conn, $sql);
// 處理查詢結果
// ...
?>問題點:直接拼接用戶輸入會導致語句被篡改,比如傳入id=1 OR 1=1將使條件恆為真,可能導致敏感數據洩露或認證繞過。
防護建議:使用參數化查詢(預處理語句)或ORM,避免直接拼接用戶輸入;對輸入進行類型校驗(例如確保id為整數);對錯誤信息進行適當處理以免洩露內部細節。
描述:未對包含文件的路徑進行嚴格控制時,攻擊者可以通過傳入特製路徑包含任意文件,甚至遠程文件(若配置允許),導致敏感文件洩露或遠程代碼執行。
<?php
$page = $_GET['page'];
// 拼接文件路徑並包含文件
include("pages/" . $page . ".php");
?>問題點:對page參數未做限制,攻擊者可以通過類似page=../config的路徑訪問上級目錄的敏感配置,或使用文件上傳後的腳本進行執行。
防護建議:不要直接包含來自用戶的路徑;採用白名單機制限定可包含的文件名稱;使用基底目錄並在包含前將路徑解析為絕對路徑並驗證其是否位於允許範圍內;關閉允許遠程包含的PHP配置選項(例如allow_url_include)。
描述:文件上傳功能若只檢查文件擴展名或名稱,攻擊者可能上載偽裝的可執行腳本並在服務器上執行,從而獲取更高權限。
<?php
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
// 檢查文件類型
$fileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg" && $fileType != "gif") {
exit("只允許上傳圖片文件!");
}
// 上傳文件
if(move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
echo "文件上傳成功!";
} else {
echo "文件上傳失敗!";
}
?>問題點:僅根據文件擴展名判斷不可靠,攻擊者可以改變擴展名或偽造MIME類型上傳惡意腳本。
防護建議:
安全不是一次操作能夠完成的,建議在開發與運維過程中採納以下實踐:
本文展示了幾類典型的PHP安全問題及其防護思路。希望開發者能把安全意識貫穿於需求、設計、實現和運維的每個環節。對於示例中的每一類漏洞,實際環境可能更複雜,建議結合代碼審計、自動化掃描與滲透測試結果進行有針對性的修復。