← SEARCHABLE ARCHIVE
Web · 2026-07-14

什麼是 SQL 注入攻擊?

使用者輸入如何變成SQL指令?

INTERACTIVE READING MODE →

該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。

如果網站將使用者輸入貼上到 SQL 語句中,則使用者可以輸入 SQL 語法而不是資料。 此漏洞稱為 SQL 注入。

常見的SQL攻擊通常指的是SQL注入。 確切地說,針對使用SQL的系統的攻擊是一個更廣泛的術語,代表性的輸入攻擊是SQL注入。

按原樣組合字串時出現的問題

假設您建立的登入代碼如下:

const sql =
    "SELECT * FROM users WHERE name = '" + userName +
    "' AND password = '" + password + "'";

當收到正常輸入時,將建立以下 SQL。

SELECT * FROM users
WHERE name = 'rose' AND password = '1234';

但是,如果使用者輸入中包含引號和 SQL 運算符,則開發人員想要的句子結構可能會發生變化。

' OR 1=1 --
SELECT * FROM users
WHERE name = '' OR 1=1 -- ' AND password = '';

1=1總是正確的,--後者可以註解掉。 原本只應被視為資料的字串已成為 SQL 指令的一部分。

它會造成什麼損害?

儘管 SQL 注入是可能的,但同樣的損害並不總是發生。 結果會根據您執行的資料庫類型、帳戶權限以及可以立即執行的語句範圍而有所不同。

不過,一般來說,可能會出現以下問題:

  • 繞過登入檢查。
  • 閱讀其他使用者的個人資訊。
  • 變更或刪除貼文或帳戶資訊。
  • 使用錯誤訊息來確定資料庫結構。
  • 如果資料庫帳號權限太高,破壞的範圍就會變大。

僅靠前端檢查無法預防這種情況。

您可以認為它是安全的,因為您的瀏覽器阻止輸入引號。 但是,攻擊者可以直接向伺服器發送 HTTP 請求,而無需透過瀏覽器螢幕。

因此,輸入長度限制和螢幕檢查僅有助於可用性。 真正的防禦必須在運行SQL的伺服器上完成。

SQL注入的核心原因並不是單一的特殊字元。 根本問題是將使用者資料和 SQL 命令混合到一個字串中。