日期:2014-05-18  浏览次数:20539 次

|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输出调试一下就可以了阿
------解决方案--------------------