|M| 从零开始学习存储过程第九贴:怎么回事啊存储过程也会提示:字符串 '' 之前有未闭合的引号。第 1 行: '' 附近有语法错误。
本来我是一直用sql语句来查询数据库的
但后来听说容易被注入还有要过虑某些字符
然后就转改用存储过程来写SQL语句
但今天发现存储过程也和SQL语句一样有这些问题,
以下是我的一条存储过程
CREATE Procedure Order_Search(
@Name nvarchar(20) --姓名
)
AS
Declare @sql nvarchar(1000)
Declare @iWhere nvarchar(1000)
Set @sql= 'SELECT * FROM Order '
Set @iWhere= ' Where 1=1 '
if @Name <> ' '
Begin
Set @iWhere=@iWhere + ' And Name Like ' '% ' + @Name + '% ' ' '
End
Set @sql=@sql + @iWhere
Execute sp_executesql @sql
GO
就是上面的这条存储过程
但当传入的Name= " ' "
的时候就会提示:字符串 ' ' 之前有未闭合的引号。第 1 行: ' ' 附近有语法错误。
那这样写和我的SQL语句: "SELECT * FROM Order Where Name like '% " + name + "% ' "
有什么区别啊
晕
------解决方案--------------------sf
------解决方案--------------------其实SQL也挺好的,我就一直用。
防注入也好办。
if (是数字)
判断是不是数字
else if (是字符串)
处理 “ '” ,可以过滤掉,也可以替换成 “ ' '”,或者替换成 “‘”(就是全角的)。
做到以上两点就可以防止注入了。
------解决方案--------------------另外我是很反感在存储过程里面组合SQL的,这样做和在程序里面组合有什么区别呢?
即防不了注入,又不能使用存储过程“预编译”的特点。
------解决方案--------------------使用存储过程是应该这样的
CREATE Procedure Order_Search(
@Name nvarchar(20)--姓名
)
AS
SELECT * FROM Order
Where 1=1
and (@Name = ' ' or Name Like @Name )
这样就防止注入了。
当参数为 ' ' 的时候,就相当于没有查询条件,显示所有的数据。
------解决方案--------------------使用存储过程是应该这样的
CREATE Procedure Order_Search(
@Name nvarchar(20)--姓名
)
AS
SELECT * FROM Order
Where 1=1
and (@Name = ' ' or Name Like @Name )
这样就防止注入了。
当参数为 ' ' 的时候,就相当于没有查询条件,显示所有的数据。
------解决方案--------------------更正一下:
CREATE Procedure Order_Search(
@Name nvarchar(20)--姓名
)
AS
set @Name = '% ' + @Name + '% '
SELECT * FROM Order
Where 1=1
and (@Name = ' ' or Name Like @Name )
------解决方案-------------------- <> ' '改为 is not null 说着 中间不有空格
------解决方案--------------------用@就行了
------解决方案--------------------CREATE PROC Order_Search(
@Name nvarchar(20)--姓名
)
AS
BEGIN
IF @Name IS NOT NULL
set @Name = '% ' + @Name + '% '
SELECT * FROM [Order] --少用 * AND 關鍵字 (Order)
WHERE (@Name IS NULL OR Name LIKE @Name)
END
------解决方案--------------------使用print输出调试一下就可以了阿
------解决方案--------------------