公司DBA不允許創建的存儲過程中有拼接SQL語句的行為,請問,該怎麼解決?說是這樣做有風險,說我非要用的話,可以簽一份風險協議,出了問題我負責之類的。請問:各位在多條件查詢這種情況下,存儲過程都是怎麼寫的?有不拼接又省事的辦法嗎?另外,這個風險難道微軟沒有提供解決方案嗎?
真正的風險, 不在於拼SQL, 而是輸入值沒有參數化。
比如:
delare @sql nvarchar(max), @name nvarchar(20)
set @name='小明'
set @sql = 'select * from user where username like ''%'+@name+'%'''
--下面有風險
exec (@sql)
--下面這種無風險
set @sql = 'select * from user where username like ''%@name%'''
exec sp_executesql
@stmt=@sql,
@params =N'@name as nvarchar(20)',
@name=@name
其實道理很簡單, 如果都是sqlserver內部、數據庫內部、你自己寫的東西 比如 select , from , where 之類的肯定沒有問題, 不用怕。
怕的是什麼呢?怕的是外部傳過來的東西——比如上面的@name, 這個是從網站的頁面傳過來的, 如果不用參數化, 絕對有sql注入風險!
sql注入
如果你還有疑問, 可以列出具體的例子來, 我可以為你盡力解答!