今天看了兩篇關於存儲過程SQL注入漏洞的文章:
1):如此高效通用的分頁存儲過程是帶有sql注入漏洞的
2):防SQL注入:生成參數化的通用分頁查詢語句
怎麼看怎麼覺的別扭,在我印象中存儲過程是不會存在注入漏洞的啊?起碼我目前的水平還不了解如何 注入存儲過程。如果大家有注入的方法請指教。換句話說存儲過程本身並無注入漏洞,只不過有漏洞大多 都是因為程序漏洞導致。
我們來簡化下之前兩位園友討論的分頁存儲過程,原代碼太長,我這裡呢寫一個針對一個單表查詢的存 儲過程。創建一個用戶表,表結構如下:有三個字段,人員ID,姓名字段。
CREATE TABLE [dbo].[person](
[id] [int] NULL,
[last_name] [varchar](30) COLLATE Chinese_PRC_CI_AS NULL,
[first_name] [varchar](30) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
然後寫一個查詢存儲過程(getPerson):作用,根據不同的條件讀取用戶信息。
IF ( EXISTS ( SELECT *
FROM sysobjects
WHERE id = OBJECT_ID(N'[dbo].[getPerson]')
AND OBJECTPROPERTY(id, N'IsProcedure') = 1 ) )
BEGIN
DROP PROCEDURE [dbo]. [getPerson]
END
Go
CREATE PROC getPerson
@strWhere VARCHAR(100) = '' -- 查詢條件 (注意: 不要加 where)
AS
BEGIN
DECLARE @strSQL VARCHAR(1000) -- 主語句
SET @strSQL = 'select top 10 * from person where 1=1 '
--如果存在條 件,則加上
IF @strWhere != ''
BEGIN
SET @strSQL = @strSQL + @strWhere
END
PRINT ( @strSQL )
EXEC ( @strSQL
)
END