日期:2014-05-17  浏览次数:20943 次

asp常识

sp常识
server.htmlEncode还为HTML编码(用于输出不正常)
很多人抱怨ASP安全不高、速度不快,其实ASP也很优秀。用PHP一样可以写出拉圾程序,用ASP依然可以写出很优秀的程序。安全高不高取决于编程 者,PHP依然可以写出漏洞百出的程序,所以,别抱怨ASP这样那样的毛病,我写ASP已经三年多了,一直都认为它很方便,虽然有些地方写着很复杂,及不 上PHP,因为这样,ASP写着感觉更爽。把多年总结的一些ASP常见的安全事项写出来。

一、古老的绕验证漏洞

虽然古老,依然存在于很多小程序之中,比如一些企业网站的后台,简单谈谈。这个漏洞出现在没有对接受的变量进行过滤,带入数据库判断查询时,造成SQL语句的逻辑问题。例如以下代码存在问题:

username=request("username")

password=request("password")

sql = "select * from user where username='" & username & "' and password='" & password & "'"

很容易看出在没有对username、password进行过滤就带入SQL语句进行判断了,提交'or''=',SQL语句就变成了select * from user where username=''or''='' and password=''or''='',返回值为ture。

一般在登录处过滤字符,代码如下:

replace(request.form("username"),"'","")

replace(request.form("password"),"'","")

上面指定了POST方式接受提交过来的数据,指定接受方式很重要,下面谈谈。

二、指定接受数据提交方式

ASP 中的Request对象可以接受GET、POST、COOKIES请求。将其简化写成**=Request("参数")的格式接受数据,此时WEB接受数 据时先以GET方式接受,如果不匹配再以POST方式接受,最后再以Cookies方式接受。也就是Cookies注射造成的原因。

指定接受方式不仅可以避免Cookies注射,还可以提高WEB处理的速度。

一个存在问题的代码如下:

id=request("id")

sql="select * from Articles where id="&id&""

set rs=conn.execute(sql)

这里不管id过滤没有过滤,关键是id接受时没有指定接受方式,造成了Cookies注射。

这样写:

id=request.QueryString("id")

sql="select * from Articles where id="&id&""

set rs=conn.execute(sql)

id使用了get方式接受数据。

三、HtmlEnCode

HtmlEnCode是ASP中Server的一个对象,可以直接格式化HTML不被执行在浏览器上,比如以下代码:

<%

lx="<script>alert('test')</script>"

response.write lx

%>

最后浏览时弹出提示窗口。

如果改成以下代码:

<%

lx="<script>alert('test')</script>"

lx=Server.HtmlEncode(lx)

response.write lx

%>

浏览器直接显示<script>alert('test')</script>,HTML代码直接被格式化了。

这个对象很有用,一般在接受数据不需要使用HTML代码格式的情况下,直接使用它进行过滤。比如搜索结果显示、留言板等等。如:

test=request.QueryString("test")

response.write test

以上代码中,test没有进行过滤直接显示了,如果test接受一个内容为<script>alert("test")</script>时,代码被执行,就会弹出一个内容为test的提示。

改写为下:

test=server.htmlencode(request.QueryString("test"))

response.write test

那么再次提交<script>alert("test")</script>,浏览器就显示一段字符"<script>alert("test")</script>".

四、注射漏洞

注射方面就不多介绍了,介绍起来太多了,大家也很熟悉,直接说防范方法,有问题的代码如下:

id=request("id")

sql="select * from Articles where id="&id&""

set rs=conn.execute(sql)

明显id不进行过滤带入了SQL查询,最简单的方法就是判断id是否为整型数据,代码如下:

id=Request("id")

if Not IsNumeric(id) then '这里用IsNumeric判断id是否为整型

Response.write "错误提交"

Response.end

else

sql="select * from Articles where id="&id&""

set rs=conn.execute(sql)

end if

还可以使用判断提交内容是否含有非法字符,直接贴代码,代码是以前小蓝的Tryaspwebsystem程序中的防注射代码,经过我们两个改了又改:

<%

dim sql_injdata

SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"

SQL_inj = split(SQL_Injdata,"|")

'get拦截

If Request.QueryString<>"" Then

For Each SQL_Get In Request.QueryString

For SQL_Data=0 To Ubound(SQL_inj)

if instr(LCase(Request.QueryString(SQL_Get)),Sql_Inj(Sql_DATA))>0 Then

Response.Write "非法提交"

Response.end

end if

next

Next

End If

'post注入拦截 If Request.Form<>"" Then

For Each Sql_Post In Request.Form

For SQL_Data=0 To Ubound(SQL_inj)

if instr(LCase(Request.Form(Sql_Post)),Sql_Inj(Sql_DATA))>0 Then

Response.Write "非法提交"

Response.end

end if

next

next

end if

on error resume next

%>

上面代码中没有看到防范Cookies注射的?前面说了,指定了接受方式就没问题了。

五、字符过滤

一般用来防止跨站,定义一个结构,将非法的字符全部替换了:

function Str( data )

Str = replace( data, "'", "''" )

Str = replace( Str, "&", "&" )

Str = replace( Str, " ", "