'*********************************************************
' 目的: 检查参数
' 返回: 出错则转到ShowError(3)
'*********************************************************
Function CheckParameter(byRef source,strType,default)
On Error Resume Next
If strType="int" Then
'数值
If IsEmpty(source) Then
source=default
ElseIf IsNumeric(source) Then
source=CLng(source)
ElseIf source="" Then
source=default
Else
Call ShowError(3)
End if
If Err.Number<>0 Then Call ShowError(3)
CheckParameter=True
ElseIf strType="dtm" Then
'日期
If IsEmpty(source) Then
source=default
ElseIf IsDate(source) Then
source=CDate(source)
ElseIf source="" Then
source=default
Else
Call ShowError(3)
End if
If Err.Number<>0 Then Call ShowError(3)
CheckParameter=True
ElseIf strType="sql" Then
'SQL
source=CStr(Replace(source,chr(39),chr(39)&chr(39)))
Else
Call ShowError(0)
End If
End Function
'*********************************************************
这则函数是取自Z-Blog的c_function.asp文件,Sipo的用法是这样的:
Call CheckParameter(Request("s_title"),"sql",1)
函数的第一个形参是标记byRef的,也就是传入引用,但Sipo放入的Request("s_title"),Request是系统组件,Request("s_title")是不能被赋值的,系统也不会报错,也就产生了SQL过滤无效的问题。
另外,函数本身也可以修改,如果不用去传值,而直接将过滤好的值做为返回值返回给变量,也就没有这个问题了,就象c_function.asp中的另一个函数FilterSQL一样,我本人是只用FilterSQL过滤的。
所以忽视了细节问题,还是会出大麻烦的。
这几天还看了点.Net的东东,什么接口、反射,委托、还有泛型等,有点头大,发现从一个极端走向另一个极端:设计过度,过于追求完美的设计模式,也未必是件好事,CommunityServer还是非常的复杂的。
如果从用户体验的角度来说,应该是尽量使用户输入的内容得以保存,并遵循最简化的原则进行过滤,3楼的说的停止执行好象有点不太人道吧。。。。
我比较支持停止执行,暂封IP都成,嘿嘿,让他想注入……
这个还是不要太关注为好,安生措施总是赶不上反安全措施。
cs你也在看啊,是不是准备给zblog升级用啊?
对不起,想和你说下,跟你没关系,根本不是以为这个被黑的!
证实一下,楼上是黑客当事人...偶的好友....
原来是自己的朋友黑的啊
这样写过滤函数,还是存在一些隐患,我的做法是直接用自己的函数取代request对象,在自己的request函数中加入一个参数,设定是否允许非法字符,默认不允许,这样,在request进入的时候就做了判断,而不是等到用的时候才作判断。
我觉得,单独过滤更适合于报错等信息,用自己的函数更好控制应该……
和Z-BLOG完全没有关系~是SXNA自身的问题导致的