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

|M| 从零开始学习存储过程第十贴:写了存储过程,但CSDN朋友都说组SQL不能防止注入和' 那我这写的第一条存储过程要怎么改 谢谢 急
因为自己查询的时候拼写SQL语句的时候不能够防止用户输入 '出错的问题
(又不想去打如 '转成 ' ')
后来听说用SQL存储过程可以解决这个问题
然后学习了存储过程的写法,写了以下一条查询语句

CREATE   Procedure   COrder_Search(
@OrderID   int,
@MemberID   int,  
@MyClass   nvarchar(8),  
@MyDayBegin   datetime,  
@MyDayEnd   datetime,  
@MyState   int,
@MyPayID   int,
@MyPostID   int,
@MyName   nvarchar(20)
)
AS
Declare   @sql   nvarchar(1000)
Declare   @iWhere   nvarchar(1000)
Set   @sql= 'SELECT   *   FROM   B2COrder '
Set   @iWhere= '   Where   1=1 '
if   @OrderID   <>   -1
Begin
Set   @iWhere=@iWhere   +   'And   OrderID   =   '   +   convert(nvarchar,@OrderID)
End
if   @MemberID   <>   -1
Begin
Set   @iWhere=@iWhere   +   'And   MemberID   =   '   +   convert(nvarchar,@MemberID)
End
if   @MyClass   <>   ' '
Begin
Set   @iWhere=@iWhere   +   'And   MyClass   =   ' ' '   +   @MyClass   +   ' ' ' '
End
if   @MyDayBegin   >   '1900-01-01 '
Begin
Set   @iWhere=@iWhere   +   '   And   DateDiff(d,MyDay, ' ' '   +       convert(nvarchar,@MyDayBegin   )   +   ' ' ')   <=   0 '
End
if   @MyDayEnd   >   '1900-01-01 '
Begin
Set   @iWhere=@iWhere   +   '   And   DateDiff(d,MyDay, ' ' '   +   convert(nvarchar,@MyDayEnd   )+   ' ' ')   > =0 '
End
if   @MyState   <>   -1
Begin
Set   @iWhere=@iWhere   +   'And   MyState   =   '   +   convert(nvarchar,@MyState   )
End
if   @MyPayID   <>   -1
Begin
Set   @iWhere=@iWhere   +   'And   MyPayID   =   '   +   convert(nvarchar,@MyPayID   )
End
if   @MyPostID   <>   -1
Begin
Set   @iWhere=@iWhere   +   'And   MyPostID   =   '   +   convert(nvarchar,@MyPostID   )
End
if   @MyName   <>   ' '
Begin
Set   @iWhere=@iWhere   +   '   And   MyName   Like   ' '% '   +   @MyName   +   '% ' ' '
End
Set   @sql=@sql   +   @iWhere
Execute   sp_executesql   @sql
GO

像我以上的查询功能要防止注入和 '   要怎么办呢
谢谢     急

------解决方案--------------------
if CHARINDEX( 'and ', @MyClass)> 0
Return

------解决方案--------------------
帮顶,同样的问题,还没解决思路
------解决方案--------------------
防SQL注入我也没多少经验
我现在就是用验证控件验证或用存储过程验证用户输入的数据是否合法,对字符串类型的数据过滤掉 ' select delect insert update 等关键字
另外 连接时不要用SA做连接
------解决方案--------------------
字符传进存储过程的时候先做相应的替换吧
------解决方案--------------------