0

EXECUTE() を呼び出す文字列を生成するストアド プロシージャがあります。文字列には UPDATE ステートメントが含まれています。ただし、実行中の列と値は事前にわかりません。これらは、XML 文字列を介してストアド プロシージャに入力されます。次に、XML クエリを使用してデータを取得し、一時テーブルに入れます。

これはデータのサニタイズではありません。

DECLARE @TBL_FLD TABLE (
    TBL         VARCHAR(MAX),
    COL         VARCHAR(MAX),
    VAL         VARCHAR(MAX)
);

-- Fill @TBL_FLD via xml parsing (omitted for brevity)

DECLARE TBL_CURSOR CURSOR FOR
SELECT distinct (TBL) FROM @TBL_FLD;

OPEN TBL_CURSOR;
WHILE 1 = 1
BEGIN
    FETCH NEXT FROM TBL_CURSOR INTO @TABLE_NAME
    IF ( @@FETCH_STATUS <> 0 )
        BREAK

    SET @SETTING_STR = '';
    SELECT @SETTING_STR = STUFF( ( SELECT ', ' + COL + ' = ''' + VAL + '''' FROM @TBL_FLD WHERE TBL = @TABLE_NAME FOR XML PATH('') ), 1, 2, '');

    SET @SQL_QUERY += 'UPDATE ' + @TABLE_NAME + ' SET ' + @SETTING_STR + ' WHERE KEY = ' + CONVERT(VARCHAR(MAX), @KEY_VAL) + '; ';

END
CLOSE TBL_CURSOR
DEALLOCATE TBL_CURSOR

EXECUTE (@SQL_QUERY);

@TBL_FLD の COL フィールドを信頼しますが、VAL はユーザーからのものです。データを連結しているだけなので、これは大きなセキュリティ ホールを残します。もっと良い方法があるはずです。

不明な数の列があるため、ステートメントのパラメーターを簡単に作成してデータをクリーンアップすることはできません。最悪の場合、私はそれを行うことができます (ストアド プロシージャで更新 SQL を動的に作成する への回答を参照)。

データをやみくもにステートメントに追加する前に、データをサニタイズする関数またはメソッドはありますか? または、私がやろうとしていることを行うためのより良い方法はありますか?

4

1 に答える 1