Sql注入是我们经常听说的,具体极大的风险性,下面给一个比较直观的示例:
USE tempdb
GO
IF OBJECT_ID('stu') IS NOT NULL
DROP TABLE stu
GO
CREATE TABLE stu(
stuId INT IDENTITY(1,1) PRIMARY KEY,
stuName NVARCHAR(20) NOT NULL
)
GO
INSERT INTO stu(stuName) VALUES ('小明'),('小红'),('小江')
GO
--SELECT * FROM stu
/*
stuId stuName
1 小明
2 小红
3 小江
*/
GO
---------------- A. 使用参数化 -------------------
DECLARE @sql NVARCHAR(MAX),
@stuName NVARCHAR(20) --用户输入部分
SET @sql='select * from stu where 1=1 and stuName=@stuName'
SET @stuName='''小明'';truncate table stu;'
PRINT @sql
EXEC sp_executesql @sql,N'@stuName nvarchar(20)',@stuName
SELECT * FROM stu
--没有查到任何记录,但原本的记录没有受影响
---------------- B. 拼接SQL -------------------
DECLARE @sql2 NVARCHAR(MAX),
@stuName2 NVARCHAR(50) --用户输入部分
SET @sql2='select * from stu where 1=1 and stuName='
SET @stuName2='''小明'';truncate table stu;'
SET @sql2+=@stuName2
PRINT @sql2
EXEC (@sql2)
SELECT * FROM stu
--能查到一条记录(小明),但表中所有记录已被清空
所以,使用参数化,能避免SQL注入带来的风险。
拼接SQL,拼接到用户输入字符串时,因用户输入是不可控的,没有参数化会产生不可预料的结果,应该尽量避免。