1
你能看到這個查詢中的任何明顯的錯誤嗎?我得到的錯誤是:`列表中的未知列003ADF50。 003ADF50 wtf?無法找出這個錯誤
query << "UPDATE `record` SET `record` = " << lastRecord << ", `time` = " << time;
你能看到這個查詢中的任何明顯的錯誤嗎?我得到的錯誤是:`列表中的未知列003ADF50。 003ADF50 wtf?無法找出這個錯誤
query << "UPDATE `record` SET `record` = " << lastRecord << ", `time` = " << time;
這裏看起來會發生什麼是你注入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的名字找到其方法變量之一會發生什麼。
我看到的最大錯誤是您沒有使用預處理語句。 – 2010-07-17 02:52:21
查詢應該如何在純sql中進行? – Tom 2010-07-17 02:54:13
是表名和屬性名真的'記錄'? – northpole 2010-07-17 02:54:57