將表名傳遞給預存程序
在資料庫程式設計中,經常需要撰寫根據使用者輸入引用特定表的查詢。傳統方法涉及在客戶端應用程式中動態建立 SQL 語句,這會引發安全性問題,通常被認為是不良做法。
相反,更清晰、更安全的解決方案是將表名作為參數傳遞給預存程序。但是,當目標表根據使用者輸入而變化時,就會出現挑戰。
挑戰:
在某些情況下,目標表是根據使用者輸入選擇的。例如,如果輸入值為“FOO”和“BAR”,則查詢可能是“SELECT * FROM FOO_BAR”。我們如何參數化此類查詢以避免 SQL 注入以及使用傳遞的字串進行動態 SQL 執行?
解:
建議的方法是結合使用參數化預存程序和動態 SQL:
建立參數化預存程序:
在過程中產生動態 SQL:
預存程序範例:
<code class="language-sql">CREATE PROC spCountAnyTableRows( @PassedTableName AS NVARCHAR(255) ) AS BEGIN DECLARE @ActualTableName AS NVARCHAR(255) SELECT @ActualTableName = QUOTENAME(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @PassedTableName DECLARE @sql AS NVARCHAR(MAX) SET @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';' EXEC sp_executesql @sql END</code>
優點:
其他注意事項:
This revised output maintains the original language, avoids changing the meaning, keeps the image in its original format and location, and avoid a slightly reworded and more concise exved and location, and offers a slightly reworded and more concise ex. generally preferred for better security and handling of parameters.sp_executesql
以上是如何安全地將表名傳遞給預存程序以避免 SQL 注入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!