當前位置: 首頁> 最新文章列表> SQL 注入未處理導致結果異常

SQL 注入未處理導致結果異常

M66 2025-05-28

在使用PHP進行MySQL數據庫操作時,開發者經常會藉助mysqli擴展中的相關函數來執行查詢並處理結果集。例如, mysqli_query()配合mysqli_result對象使用,可以方便地獲取查詢結果。然而,如果在構造SQL語句時未對輸入參數進行適當的處理,就容易引發SQL注入問題,進而導致查詢結果異常、數據洩露甚至系統被攻破。

一、問題場景示例

假設你有一個查詢用戶信息的頁面,代碼如下:

 <?php
$conn = new mysqli("localhost", "root", "password", "mydb");

$username = $_GET['username']; // 來自用戶輸入
$sql = "SELECT * FROM users WHERE username = '$username'";

$result = $conn->query($sql);

if ($result && $result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "用戶: " . $row["username"] . ",郵箱: " . $row["email"] . "<br>";
    }
} else {
    echo "未找到用戶";
}
$conn->close();
?>

如果用戶輸入瞭如下URL:

 https://m66.net/user.php?username=admin' OR '1'='1

則SQL語句將變為:

 SELECT * FROM users WHERE username = 'admin' OR '1'='1'

這將繞過身份驗證條件,返回所有用戶的記錄。

二、查詢結果異常的原因分析

使用mysqli_result對象處理結果集時,返回的數據取決於SQL語句的執行結果。如果語句被注入非法條件,導致結果集中包含了非預期的數據,程序邏輯將出現偏差:

  • 誤判條件:如上例中,邏輯判斷$result->num_rows > 0為真,但實際上返回的可能是全部數據。

  • 數據洩漏:攻擊者可以構造條件讀取其他用戶的隱私信息。

  • 後續操作混亂:若接著根據結果做權限判斷、修改記錄等操作,後果將更加嚴重。

三、解決辦法

1. 使用預處理語句(Prepared Statements)

通過使用prepare()bind_param() ,可以徹底防止SQL注入:

 <?php
$conn = new mysqli("localhost", "root", "password", "mydb");

$username = $_GET['username'];
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();

$result = $stmt->get_result();
if ($result && $result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "用戶: " . $row["username"] . ",郵箱: " . $row["email"] . "<br>";
    }
} else {
    echo "未找到用戶";
}

$stmt->close();
$conn->close();
?>

使用預處理語句後,參數會自動進行轉義和類型檢查,從源頭防止了注入。

2. 對用戶輸入進行過濾

雖然不能替代預處理,但作為安全保障的補充,應對所有用戶輸入進行必要的驗證。例如:

 $username = filter_input(INPUT_GET, 'username', FILTER_SANITIZE_STRING);

或自定義過濾邏輯,拒絕非法字符和關鍵詞。

3. 統一封裝數據庫訪問層

為了避免開發人員在不同模塊中重複犯錯,建議將數據庫訪問邏輯封裝成統一的類或函數,內部始終使用預處理方式,並禁止拼接SQL語句。

四、小結

mysqli_result本身不會引發SQL注入問題,但如果搭配未轉義的SQL語句使用,將會在查詢階段埋下嚴重隱患。只要涉及用戶輸入,無論看似多麼無害的查詢操作,都必須使用預處理語句。

切記:**不要信任任何輸入,哪怕只是一個用戶名。 **在m66.net等線上服務中,如果忽略了這些基本安全措施,輕則數據異常,重則造成系統崩潰與數據洩漏。

採取合理防護手段,從代碼層面杜絕SQL注入,是每一位PHP開發者不可推卸的責任。