2014-10-16 72 views
3

我有這個簡單的MySQL查詢:MySQL的「插入」和SQL注入

INSERT INTO table (col1, col2) VALUES ('1', '2') 

col1col2外鍵的另一個表,以便爲col1col2任何值必須存在於其他表或以其他方式行不會被插入。

在這種情況下仍然存在SQL注入的風險嗎?如果我從PHP POST接收到這些col值,在插入數據庫之前是否還需要綁定它們,或者它們已經是安全的,因爲cols是外鍵?

+2

只要正確使用「準備好」的查詢,很多「問題」就會消失。如果你總是**用'動態'參數'準備'查詢,那麼你將是'安全'。你必須'驗證'所有的輸入,但是如果'不到有用的東西'進入數據庫,它不是'有害的'。首先,我並不關心「效率」。 – 2014-10-16 19:57:57

+2

這是可接受的唯一方法是,如果你知道輸入不可能有惡意代碼。不幸的是,如果您依賴最終用戶輸入,或者甚至是現有的數據庫值,則無法真正瞭解這一點。出於所有實際目的,總是假定最終用戶不合格,並且不相信來自他們的任何輸入是乾淨的。 – user2366842 2014-10-16 19:58:13

+0

請閱讀下面的內容:http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – 2014-10-16 21:20:36

回答

6

是的。所有來自用戶的輸入信息都需要進行檢查以進行消毒。例如。如果用戶向您發送一個類似'2'); drop table <table>的字符串作爲您的第二個值,它可能會被執行並給您帶來一些驚喜。 (字符串可能無法正常工作,但我認爲你得到了點)

+1

我不認爲理智是你尋找的詞。來自用戶的所有輸入都需要進行消毒。 – Grice 2014-10-16 19:56:21

+0

愚蠢的外語。但至少它接近;)更新答案。 – frlan 2014-10-16 19:57:36

2

它確實傾向於SQL注入,因爲用戶可以,例如,打破您的查詢並獲取有關您的RDBMS和您的數據庫模式的錯誤信息消息,並用它來準備對您的應用程序的其他攻擊。

有很多方法可以探索SQL注入問題。

2

是的,即使有外鍵約束也總會有注射風險。如果我知道什麼是有效的col1和col2值,我可以使用這些值來構建攻擊。最好總是擦除用戶輸入並假定用戶正試圖傷害您的數據庫。

+0

+1。如何解決這個問題可能完全是一個不同的話題(如果外鍵是數字而非GUID/UUID則可能更容易實現),但只要正確處理數據插入就容易得多。 – user2366842 2014-10-16 20:09:43

+0

嗯,這取決於,如果鑰匙是暴露在某個地方,如在下拉列表中,比它容易,無論他們在什麼格式。但是,你是對的,如果密鑰永遠不會顯示在服務器之外,那麼GUID/UUID將更難以破解。我可以做一個「INSERT INTO table(col1,col2)VALUES('1',(SELECT col2 FROM

),如果我不知道他們的密鑰,但可以通過生成一個錯誤獲取約束表名稱, ); DROP TABLE ....「 – ChrisStillwell2014-10-16 20:12:25

1

在PHP中構建數據庫查詢時,使用一個接口,該接口允許您爲數據使用佔位符,以自動處理任何轉義。例如,您的查詢如下所示:

INSERT INTO table (col1, col2) VALUES (:col1, :col2) 

然後,您可以使用PDO等驅動程序中的相應方法進行綁定。如果您對使用佔位符進行用戶數據處罰,發生SQL注入漏洞的可能性非常低。

properly escape用戶輸入有多種方式,但是您一定要在全部用戶數據中使用它們,沒有例外。一個錯誤就足以使您的網站全面開放。