我想轉換SQL語句以支持sp_executesql使其安全,但我碰到了一個不安全的區域。希望你們能幫助我解決這個問題。我創建了臨時表以便更容易地演示問題。sp_executesql保護動態搜索關鍵字
問題在於步驟#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 ('[email protected]+') ORDER BY '[email protected];--unsafe, open to hackers
EXECUTE sp_executesql @SQLString, @ParmDefinition, @Param1ProductName = @Keywords, @[email protected];
--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, @[email protected];
--Drop temp table
DROP TABLE #TempTable
#6如何不工作?有錯誤嗎? –
MS SQL 2008錯誤消息4145,級別15,狀態1,行4在'ORDER'附近預期條件的上下文中指定的非布爾類型的表達式。 –