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

PHP 防止 SQL 注入的基本處理方式分析

     編輯:PHP 綜合知識

SQL 注入是 Web 應用常見漏洞。本文以 DVWA High 級別原始碼為例,說明基本防禦步驟:移除反斜線 + 轉義特殊字元 + 型別檢查。

參考程式碼(DVWA High)

$id = $_GET['id'];
$id = stripslashes($id);
$id = mysql_real_escape_string($id);
if (is_numeric($id)) {
    $getid = "SELECT first_name, last_name FROM users WHERE user_id='$id'";
    $result = mysql_query($getid) or die('<pre>'.mysql_error().'</pre>');
    $num = mysql_num_rows($result);
}

步驟解析

  1. stripslashes():移除魔術引號自動加入的反斜線(舊版 PHP 相容)
  2. mysql_real_escape_string():將特殊字元(如單引號、雙引號、NULL)轉義,防止改變 SQL 語意
  3. is_numeric():確認參數為數字,進一步縮小攻擊面

現代最佳實踐:預處理語句

上述方式屬於舊式 mysql_* 擴充套件(已移除),現代 PHP 應改用 PDO 或 MySQLi 預處理語句:

// PDO 範例
$stmt = $pdo->prepare("SELECT first_name, last_name FROM users WHERE user_id = ?");
$stmt->execute([$id]);
$rows = $stmt->fetchAll();

// MySQLi 範例
$stmt = $mysqli->prepare("SELECT first_name, last_name FROM users WHERE user_id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();

防禦原則總結

  • 永不直接拼接變數進 SQL 字串
  • 一律使用參數綁定(Prepared Statements)
  • 輸入驗證(白名單、型別、長度)作為第二道防線
  • 資料庫帳號遵循最小權限原則
  • 錯誤訊息不應直接顯示給使用者

本文所述的 stripslashes + mysql_real_escape_string 僅為歷史參考,新專案請務必採用預處理語句。

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