什麼是 SQL 注入攻擊?
使用者輸入如何變成SQL指令?
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
如果網站將使用者輸入貼上到 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 命令混合到一個字串中。