我有這個簡單的MySQL查詢:MySQL的「插入」和SQL注入
INSERT INTO table (col1, col2) VALUES ('1', '2')
col1
和col2
外鍵的另一個表,以便爲col1
和col2
任何值必須存在於其他表或以其他方式行不會被插入。
在這種情況下仍然存在SQL注入的風險嗎?如果我從PHP POST接收到這些col值,在插入數據庫之前是否還需要綁定它們,或者它們已經是安全的,因爲cols是外鍵?
我有這個簡單的MySQL查詢:MySQL的「插入」和SQL注入
INSERT INTO table (col1, col2) VALUES ('1', '2')
col1
和col2
外鍵的另一個表,以便爲col1
和col2
任何值必須存在於其他表或以其他方式行不會被插入。
在這種情況下仍然存在SQL注入的風險嗎?如果我從PHP POST接收到這些col值,在插入數據庫之前是否還需要綁定它們,或者它們已經是安全的,因爲cols是外鍵?
它確實傾向於SQL注入,因爲用戶可以,例如,打破您的查詢並獲取有關您的RDBMS和您的數據庫模式的錯誤信息消息,並用它來準備對您的應用程序的其他攻擊。
有很多方法可以探索SQL注入問題。
是的,即使有外鍵約束也總會有注射風險。如果我知道什麼是有效的col1和col2值,我可以使用這些值來構建攻擊。最好總是擦除用戶輸入並假定用戶正試圖傷害您的數據庫。
+1。如何解決這個問題可能完全是一個不同的話題(如果外鍵是數字而非GUID/UUID則可能更容易實現),但只要正確處理數據插入就容易得多。 – user2366842 2014-10-16 20:09:43
嗯,這取決於,如果鑰匙是暴露在某個地方,如在下拉列表中,比它容易,無論他們在什麼格式。但是,你是對的,如果密鑰永遠不會顯示在服務器之外,那麼GUID/UUID將更難以破解。我可以做一個「INSERT INTO table(col1,col2)VALUES('1',(SELECT col2 FROM
只要正確使用「準備好」的查詢,很多「問題」就會消失。如果你總是**用'動態'參數'準備'查詢,那麼你將是'安全'。你必須'驗證'所有的輸入,但是如果'不到有用的東西'進入數據庫,它不是'有害的'。首先,我並不關心「效率」。 – 2014-10-16 19:57:57
這是可接受的唯一方法是,如果你知道輸入不可能有惡意代碼。不幸的是,如果您依賴最終用戶輸入,或者甚至是現有的數據庫值,則無法真正瞭解這一點。出於所有實際目的,總是假定最終用戶不合格,並且不相信來自他們的任何輸入是乾淨的。 – user2366842 2014-10-16 19:58:13
請閱讀下面的內容:http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – 2014-10-16 21:20:36