2010-07-17 63 views
1

你能看到這個查詢中的任何明顯的錯誤嗎?我得到的錯誤是:`列表中的未知列003ADF50。 003ADF50 wtf?無法找出這個錯誤

query << "UPDATE `record` SET `record` = " << lastRecord << ", `time` = " << time; 
+4

我看到的最大錯誤是您沒有使用預處理語句。 – 2010-07-17 02:52:21

+0

查詢應該如何在純sql中進行? – Tom 2010-07-17 02:54:13

+2

是表名和屬性名真的'記錄'? – northpole 2010-07-17 02:54:57

回答

4

這裏看起來會發生什麼是你注入sql的那些值之一是003ADF50。 (可能是time的值?)

Brendan Long是正確的:您應該使用預處理語句來正確處理SQL中的參數。手動串聯字符串會導致像您在這裏看到的引用問題,這可能是您代碼中的嚴重安全問題。您遇到的具體引用問題是參數在結果查詢字符串中未引用。如果你手動鍵入SQL到MySQL客戶端,你會這樣說:

UPDATE `record` set `record` = 'foo'; 

相反,如果你離開了就'foo'引號,你必須:

UPDATE `record` set `record` = foo; 

這是試圖將記錄列設置爲foo列的值,而不是文字字符串'foo'。您從C++生成的SQL也會發生同樣的情況。試圖通過手動添加引號來解決這個問題並不是一個好主意 - 當字符串參數包含引號字符時會發生什麼?最好的做法是使用準備好的語句。

此外,谷歌有關SQL參數注入的着名XKCD漫畫的「小型桌面表」,並考慮如果Bobby Tables的名字找到其方法變量之一會發生什麼。