首頁 >資料庫 >mysql教程 >如何安全地將表名傳遞給預存程序以避免 SQL 注入?

如何安全地將表名傳遞給預存程序以避免 SQL 注入?

Barbara Streisand
Barbara Streisand原創
2025-01-15 12:18:46901瀏覽

How Can I Safely Pass Table Names to Stored Procedures to Avoid SQL Injection?

將表名傳遞給預存程序

在資料庫程式設計中,經常需要撰寫根據使用者輸入引用特定表的查詢。傳統方法涉及在客戶端應用程式中動態建立 SQL 語句,這會引發安全性問題,通常被認為是不良做法。

相反,更清晰、更安全的解決方案是將表名作為參數傳遞給預存程序。但是,當目標表根據使用者輸入而變化時,就會出現挑戰。

挑戰:

在某些情況下,目標表是根據使用者輸入選擇的。例如,如果輸入值為“FOO”和“BAR”,則查詢可能是“SELECT * FROM FOO_BAR”。我們如何參數化此類查詢以避免 SQL 注入以及使用傳遞的字串進行動態 SQL 執行?

解:

建議的方法是結合使用參數化預存程序和動態 SQL:

  1. 建立參數化預存程序:

    • 建立一個接受表名參數的預存程序。
    • 在過程中,使用傳遞的表名動態產生查詢。
    • 確保針對白名單驗證傳遞的表名,或使用查找來防止惡意輸入。
  2. 在過程中產生動態 SQL:

    • 使用預存程序中的傳遞表名來組合 SQL 語句。
    • 使用 EXECUTE 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>

優點:

  • 安全性: 透過避免使用傳遞的字串進行動態 SQL 執行,這種方法可以防止 SQL 注入攻擊。
  • 清晰性: 參數化查詢有助於使程式碼井井有條且易於維護。
  • 效率: 預存程序可以快取和重複使用,與動態 SQL 相比,可以提高效能。

其他注意事項:

  • 範例中使用 QUOTENAME 來確保正確轉義傳遞的表名中的特殊字元。
  • 使用 INFORMATION_SCHEMA 進行尋找轉換以驗證輸入的表名。
  • 必要時,也可以使用 SQL 參數動態傳遞列名。

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn