這是一種在使用 SQL(結構化查詢語言)作為資料庫管理語言的資料庫系統中常見的安全攻擊。當攻擊者將惡意 SQL 程式碼注入使用者輸入欄位(例如表單欄位或 URL)以不當存取或修改資料庫中的資料時,就會發生這種攻擊。
SQL 注入在 2021 年 OWASP Top 10 中排名第 3,這是開放 Web 應用程式安全項目 (OWASP) 列出的 Web 應用程式最常見和最重要的安全漏洞列表,該列表每次都會更新。多年來反映不斷變化的網路威脅
SQL 注入攻擊被列為第三大威脅,這表明了該問題在 Web 應用程式安全方面的重要性和普遍性。正確處理注入攻擊對於保護資訊系統和防止不必要的存取至關重要
SQL 注入攻擊可以透過多種不同方式進行,但最常見的有兩種:
假設有一個Web應用程式允許使用者使用PHP程式碼登入
<?php $username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * FROM users WHERE username='$username' AND password='$password'"; $result = mysqli_query($conn, $query); if (mysqli_num_rows($result) > 0) { echo "Login successful!"; } else { echo "Invalid username or password."; } ?>
此程式碼存在漏洞,因為將使用者值直接插入 SQL 語句中可能會導致 SQL 注入
駭客可以將惡意值插入到這樣的欄位
這使得 SQL 語句看起來像這樣
SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1'
因為 '1'='1' 是一個總是為真的條件。此命令傳回資料庫中每個使用者的資訊。這使得駭客無需使用真實密碼即可登入
有多種方法可以防止 SQL 注入,例如
<?php $stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?"); $stmt->bind_param("ss", $username, $password); $username = $_POST['username']; $password = $_POST['password']; $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { echo "Login successful!"; } else { echo "Invalid username or password."; } ?>
在這個範例中,SQL語句是預先準備好的,$username和$password值稍後插入到語句中。這使得注入惡意 SQL 程式碼變得不可能
SQL 注入是一個嚴重的威脅。但是可以透過編寫安全程式碼來防止這種情況,例如使用準備好的語句和驗證輸入。良好的保護不僅有助於確保資料安全。但它也有助於維持系統的可靠性。
以上是什麼是 SQL 注入?以及如何預防的詳細內容。更多資訊請關注PHP中文網其他相關文章!