我必須將一個SQL字符串注入數據庫中供第三方讀取,執行它並使用結果生成報告。由於用戶可以選擇列通緝的報告,以及重命名列,我已經有這樣的代碼結束:清理不可參數化的sql的最佳方式
string sql = "SELECT ";
foreach(KeyValuePair<string, string> field in report.fields)
{
sql += "[" + field.Key + "] as [" + field.Value + "];
}
sql += " WHERE [email protected]";
此查詢我可以參數化的唯一部分是WHERE子句,但如果我在網上的研究沒有被誤導,就沒有辦法參數化SELECT子句中的列名和別名。現在,鑑於我無法改變程序的工作方式(我必須爲第三方生成一個有效的SQL查詢來執行它),那麼對輸入字符串進行清理的最佳方式是什麼?
我已經解決了關於列名稱的部分,通過檢查列表的有效列,但我不能這樣做的別名,可以是任何小於80個字符的字符串用戶願意給。
這是一個很大的X/Y問題。一個答案是不要這樣做,並改變你的程序設計不需要這個。 – Magisch
另一種方法是僅允許字母數字ASCII字符和指定的空白字符,然後也可以轉義字符串 – Magisch
您錯過了關於「我無法改變程序工作方式」的部分。這讓你的評論成爲XY咆哮的一大提示。順便提一句,更多的解決方案是......我可以將名稱別名上的有效字符限制爲正則表達式。我會給它一個想法。 – Rekesoft