日期:2011-04-05  浏览次数:20999 次

跨站Script攻击(三)

第二部分:跨站Script攻击的防犯

一、如何避免服务器受到跨站Script的攻击

  值得庆幸的是,防止跨站Script攻击的技术正趋于完善。目前可采取这几种方式来防止跨站Script的攻击:

1.对动态生成的页面的字符进行编码

2.对输入进行过滤和限制

3.使用HTML和URL编码

1.对动态生成的页面的字符进行编码

  你们首先要采用的就是对动态生成页面的字符进行编码,你必须这样做,不然黑客很有可能更改你的字符设置而轻易地通过你
的防线。如果我们的网站是个英语网站,这样只要我们把字符编码设成拉丁字符ISO-8859-1就行了,具体情况如下:

<META http-equiv="Content-Type" content="text/html;charset=ISO-8859-1">

2.过滤和限制所有输入的数据

  这是防止跨站Script的攻击的第二种方法,在进行登录的时侯,不要让那些特殊的字符也输入进去。因此我们可在ONSUBMIT方
法中加入JAVASCRIPT程序来完成这个功能。在本例中我们限制最多只能输入15个字符。这样可以阻止那些较长的script的输入。

  在<<Knowledge Base Article QA252985>>这本书中微软提供了一个简短的Javascript程序来完成对输入数据的过滤。我们
也根据具体情况引进了这段代码用于我们的例子中,如:

function checkForm() {

document.forms[0].userName.value = _

RemoveBad(document.forms[0].userName.value);

return true;

}

// MICROSOFT'S CODE

function RemoveBad(strTemp) {

strTemp = strTemp.replace(/\</\>/\"/\'/\%/\;/\(/\)/\&/\+/\-/g,"");

return strTemp;

}

用这个办法,可以过滤在输入中含有的这些字符:

% < > [ ] { } ; & + - " '( )

3.使用HTML和URL编码

  尽管使用上面所说的过滤和限制输入的办法是一种非常重要用防御手段,但它对我的这种采用邮件方式的攻击还是无能为力。
因为我把URL的参数直接放在邮件中。针对这种情况我们不得不采取一种更有力的安全措施。如果我们用的ASP,解决起来相对说来
要容易得多。只要对动态生成的网页总进行HTML和URL编码就行了。针对我们例子中的情况,在第一输入页中我们对redirect URL
作了如下改动:

strRedirectUrl = strRedirectUrl & _

server.URLEncode(Response.Cookies("userName"))


在执行页中我们加入:

strUserName =server.HTMLEncode(Request.QueryString("userName"))



strUserName =server.HTMLEncode(Request.Form("userName"))

  微软推荐对所有动态页面的输入和输出都应进行编码。甚至在对数据库数据的存入和取出也应如此。这样你就能在很大程度上
避免跨站script的攻击。


要做到这些还要在Page1.asp中加入:


<%@ Language=VBScript %>


<% If Request.Cookies("userName") <> "" Then


'redirect if detect the cookie

Dim strRedirectUrl

strRedirectUrl = "page2.asp?userName="

strRedirectUrl = strRedirectUrl & _

server.URLEncode(Request.Cookies("userName"))

Response.Redirect(strRedirectUrl)


Else %>

<HTML>

<HEAD>

<META http-equiv="Content-Type"content="text/html; charset=ISO-8859-1">

<TITLE>MyNiceSite.com Home Page</TITLE>

</HEAD>

<SCRIPT LANGUAGE="javascript">

<!--

function checkForm() {

document.forms[0].userName.value =

RemoveBad(document.forms[0].userName.value);

return true;

}


//******************************************************

//Programmer: NOT ORIGINAL CODE - COMES FROM MICROSOFT

//Code Source: Microsoft Knowledge Base Article Q25z985

//Description: Removes bad characters.

//******************************************************


function RemoveBad(strTemp) {

strTemp =strTemp.replace(/\</\>/\"/\'/\%/\;/\(/\)/\&/\+/\-/g, "");

return strTemp;

}

//-->

</SCRIPT>

<BODY>

<BR>

<H2>MyNiceSite.com</H2>

<BR>

<FORM method="post"action="page2.asp" >

Enter your MyNiceSite.com username:

<INPUT type="text"name="userName" width="10" maxwidth="10">

<INPUT type="submit"name="submit" value="submit">

</FORM>

</BODY>

</HTML>

<% end if %>

Page2.asp中加如:


<%@ Language=VBScript %>

<% Dim strUserName

If Request.QueryString("userName")<>"" Then

strUserName =server.HTMLEncode(Request.QueryString("userName"))

Else

Response.Cookies("userName") =Request.Form("userName")

strUserName