我用一些數據庫查詢構建了一個原型系統。由於它只是一個原型,而且我對數據庫非常陌生,所以我只使用了一個直接字符串。這是我使用的字符串,它工作正常:VB.NET - 在參數化查詢時遇到一些麻煩
command = New OleDbCommand("SELECT * FROM " + prefix + "CanonicForms WHERE Type=1 AND Canonic_Form='" + item + "'", dictionary_connection)
現在,把它在實際系統中,我想用更安全的parametized方法,所以一些谷歌上搜索後,我想出了這一點:
command = New OleDbCommand("SELECT * FROM @prefix WHERE Type=1 AND [email protected]", dictionary_connection)
command.Parameters.AddWithValue("@prefix", prefix + "CanonicForms")
command.Parameters.AddWithValue("@form", item)
但我得到的是一個不完整的查詢子句的錯誤。我在兩者之間做了什麼不同?
真的嗎?如果你有一個表格名稱取決於某種輸入,是不是會打開注入問題,就像不使用參數一樣糟糕?如果我只是使用表連接,我的意思是 – cost
我會說它可以打開你。你可能想「清理」表名 - 我認爲這是很常見的。沒有人喜歡連接一個sql語句,但有時候你沒有太多的選擇。 –
@cost:SQL注入是連接UNVERIFIED/sanitized輸入的結果。如果您驗證了輸入,則您不打開SQL注入。在這種情況下,驗證輸入的首選方法是將用戶輸入的內容映射到已知的表名稱(因此不直接使用用戶輸入),如果不可能,可以先驗證表名稱是否存在,然後再進行串接它(即使用針對information_schema.tables的參數化查詢)。所以,是的,它對注射是開放的,但它不一定非常容易被注射。 – jmoreno