sp_executesql をサポートするように SQL ステートメントを変換して安全にしようとしていますが、安全でない領域に遭遇しました。うまくいけば、皆さんはこれで私を助けてくれます. 問題を簡単に説明できるように、一時テーブルを作成しました。
問題は STEP #6 にあります。STEP #5 を使用できますが、これは安全ではなく、簡単にハッキングされる可能性があります。システムのパフォーマンスのために、キーワードを壊して何度も検索したくありません。
MS SQL 2008 メッセージ 4145 のエラー、レベル 15、状態 1、行 4 'ORDER' の近くで、条件が予想されるコンテキストで指定された非ブール型の式。
GO
/****** Object: StoredProcedure [dbo].[ups_MultiWareHouse] Script Date: 06/14/2012 09:12:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
create PROCEDURE ups_TestSearch(
@Keywords nvarchar(4000),
@SortColumns nvarchar(4000)
)
AS
--STEP #1 - Create Temp Table - Begin
CREATE TABLE #TempTable
(
ProductID uniqueidentifier,
ProductName varchar(600),
Price decimal(18,2),
Active bit
)
--STEP #2 - Insert couple records to search
INSERT INTO #TempTable (ProductID,ProductName,Price,Active) VALUES(NEWID(),'Mouse','10.12','1')
INSERT INTO #TempTable (ProductID,ProductName,Price,Active) VALUES(NEWID(),'Keyboard','20.45','1')
INSERT INTO #TempTable (ProductID,ProductName,Price,Active) VALUES(NEWID(),'Monitor','150.87','0')--Disable this product
--STEP #3 - Display the current table data
select 'STEP #3' as STEP, * FROM #TempTable
--STEP #4 - SETTING UP sp_executesql to support parameter substitution
--Set definition
DECLARE @ParmDefinition nvarchar(4000);
SET @ParmDefinition='
@Param1ProductName nvarchar(4000),
@Param2SortColumns nvarchar(4000)
'
DECLARE @SQLString nvarchar(4000);
--STEP #5- CONVERT THE @SQLString TO use @Keywords and @SortColumns
--Run query for the below like this ups_TestSearch'ProductName=''Mouse'' OR ProductName=''Keyboard''', 'Price DESC, ProductName ASC'
SET @SQLString = N'SELECT ''STEP #5'' as STEP, #TempTable.* FROM #TempTable WHERE ('+@Keywords+') ORDER BY '+@SortColumns;--unsafe, open to hackers
EXECUTE sp_executesql @SQLString, @ParmDefinition, @Param1ProductName = @Keywords, @Param2SortColumns=@SortColumns;
--STEP #6- CONVERT THE @SQLString TO use @Keywords and @SortColumns
--Run query for the below like this ups_TestSearch'ProductName=''Mouse'' OR ProductName=''Keyboard''', 'Price DESC, ProductName ASC'
SET @SQLString = N'SELECT ''STEP #6'' as STEP, #TempTable.* FROM #TempTable WHERE (@Param1ProductName) ORDER BY @SortColumns';--Safe but not working
SELECT @SQLString AS SeeStatement
EXECUTE sp_executesql @SQLString, @ParmDefinition, @Param1ProductName = @Keywords, @Param2SortColumns=@SortColumns;
--Drop temp table
DROP TABLE #TempTable