2011-07-04 56 views
0

我的網站受到SQL注入的攻擊。黑客在URL查詢字符串中使用以下內容:帶有union和load_file的SQL注入()

abc-buy.php?sid=144760&op=-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29 

如何避免這些類型的攻擊?

回答

2
  1. 始終驗證不受信任的輸入。
  2. 所有輸入不可信。

如何驗證輸入取決於輸入是什麼,但在這種情況下,它可能很明顯,-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29不是(無論op是)有效輸入。

因此,在這種情況下,它可能會像添加一些代碼一樣簡單,以檢查「op」的值是否與期望值之一匹配。

if (op != "or" and op != "and" and op != "monkeys") { 
    raise_exception("Invalid op specified! Go away you trickster!"); 
} 

您應該做到這一點,你從用戶收到的每值。雖然對於自由格式的字段比如電子郵件地址或註釋等更爲棘手,但仍然要確保它們是匹配字段的有效數據,並在將任何自由格式字段插入數據庫之前將其轉義。這可以使的區別:

INSERT INTO users (username,fullname) VALUES ("bob","Robert"); DROP TABLE users; SELECT 1 WHERE "x"=""); 

和:

INSERT INTO users(username,fullname) VALUES ("bob",Robert\"\)\; DROP TABLE users\; SELECT 1 WHERE \"x\"=\""); 

功能不同之處在於,其中第一(非轉義)版,DROP TABLE users;命令執行,並與第二,你只需插入一個真正漫長而愚蠢的名字Robert"); DROP TABLE users; SELECT 1 WHERE "x"="的新用戶。

+0

+1對於一些笑話,但也不建議使用PDO或整個框架。 PDO肯定有很大的優點,但是可以不使用它。框架也可以工作,但如果OP僅用於此目的,這有點浪費 - 只需遵循標準的逃脫技巧即可。 – Bojangles

+0

使用準備好的語句(如使用PDO)很好 - 這是一種很好的做法 - 但它不是沒有驗證輸入的藉口!在沒有驗證輸入的情況下,如果您有適當設計的模式,並且不進行輸入驗證,您仍然會受到奇怪約束違規的攻擊。 – Flimzy

+0

今天我學到的其他東西:-P – Bojangles

2

切換到PDO並使用帶有佔位符的準備好的語句來處理所有事情。

0

正如大多數答案所說,您應該將所有保存到數據庫(字段佔位符)中的內容都轉義出來。

但我最近發現,您應該逃避所有的佔位符在您的查詢,原因無它:

的佔位符「FROM子句」能夠使黑客訪問任何表中的數據。

「WHERE子句」的佔位符可能允許黑客訪問當前表中的任何行。這意味着黑客可以在嘗試登錄時以數據庫中的任何用戶的身份訪問您的應用。