·建站首页 ·钻石 ·繁體
您的位置: 中国建站之家 -> 网站开发设计 -> ASP教程 -> 安全脚本程序的编写 V1.0

安全脚本程序的编写 V1.0

作者:未知  来源:转载  发布时间:2005-9-15 20:31:33  发布人:acx

本思路:
为没一个功能写一个独立的程序,程序页
尽可能少的让客户了解你的服务器端信息
不要用"客户应该这么写"这个思路想问题
尽可能多的想到不可能发生的事情

1.关于交互式动态网页可能存在的问题
1.1 form类型的交互
1.1.1 概念介绍
在我们和浏览者进行交互时,最常用到的就是form(post/get/put方法),虽然非常方便,但是很多问题也是因他而起。
form表单中input标志
用来接受用户输入的信息,例如:用户名、密码、email等。如果你没有对用户输入进行很好的检查的话,一个恶意的用户会屏蔽掉一些安全机制,绕过安全认证。例如,输入标准的HTML语句或者&#106avascript语句会改变输出结果 ,在输入框中打入标准的HTML语句会得到什么样的结果呢?比如一个留言本,我们留言内容中打入:<font size=10>你好!</font>  如果你的程序中没有屏蔽html语句,那么就会改变"你好"字体的大小。在留言本中改变字体大小和贴图有时并不是什么坏事,反而可以使留言本生动。但是如果在输入框中写个 &#106avascript 的死循环,比如:
<a herf="http://someurl" onMouseover="while(1) {window.close('/')}">第一万个惊心动魄</a> 那么其他查看该留言的客人只要移
动鼠标到"第一万个惊心动魄",上就会使用户的浏览器因死循环而死掉。
1.1.2 防范要点
(1)对特殊字符进行过滤
([\&;\`'\\\|"*?~<>^\(\)\[\]\{\}\$\n\r])/\\$1/g;),这个是最基本的,在很多地方也已经不只一次提到过
<script language="vbscript">
sub uBotton_onclick
if form1.uUserName.value=""then
msgbox"您的姓名不能为空!",0+32,"哦!还不行"
form1.uUserName.focus
exit sub
end if

if form1.uPassword.value=""then
msgbox"您的密码不能为空!",0+32,"哦!还不行"
form1.uPassword.focus
exit sub
end if

if form1.uUserName.value=""then
msgbox"您的姓名不能为空!",0+32,"哦!还不行"
form1.uUserName.focus
exit sub
end if
form1.submit
end sub
</script>


function isEmpty(objname)
{
var str = document.inputform[objname].value
var tmpstr = str.replace([\&;\`'\\\|"*?~<>^\(\)\[\]\{\}\$\n\r])/\\$1/g;,"")
var tmpstr = tmpstr.replace([\&;\`'\\\|"*?~<>^\(\)\[\]\{\}\$\n\r])/\\$1/g;,"")
return (tmpstr.length==0)
}

function check()
{
tf=document.inputform
errors=""
if (isEmpty("username")) errors += "用户名不能为空。\n";
if (isEmpty("password")) errors += "密码不能为空!\n"
if (errors!="")
alert(errors);
return (errors=="")
}
(2) 对输入的字符长度进行限制
(3) 进行尽可能多的错误出理和错误陷阱
(4) 尽可能多的使用以下这些标志,减少用户输入的机会
<input type="checkbox" name="checkbox" value="checkbox">
<select name="select"> </select>
<input type="radio" name="radiobutton" value="radiobutton">

  
1.2 post/get类型的交互

1.2.1 概念介绍
这种类型的问题主要是浏览者可以通过浏览器的地址栏对脚本页通过添加参数来和服务器进行交互,这些参数已经绕过放在客户端提交页的输入检查了,还有就是可以通过地址栏输入较长的参数或恶意编造的代码造成服务器异常运算错误,导致服务器宕机或缓冲区溢出。

1.2.2 防范要点
(1) 尽量不要让浏览者了解到你的运算提交页
(2) 不允许地址栏提交参数
例如ASP程序中的request.serverVariables(QUERY_STRING)检测是否有参数,如果有则使用response.redirect()强制返回指定页,可以
是首页,或者你自己做的警告页。
(3) 脚本页间传递参数不要再浏览器栏显示,尽可能少的让浏览者了解你的程序规则、参数等例如ASP中的Request.form和Request.QueryString这两个数据集合分别使用的是post和get方法,我们尽量不要是用Request.QueryString这个数据集合,尽可能少的让浏览者有和你交互的机会,

2. 安全认证的问题
2.1 需要安全认证密码认证的可能存在的问题
2.1.1 概念介绍
现在流行的CGI应用程序倾向于收集信用卡信息。数据收集是CGI 应用程序的一个简单的任务,但是敏感信息的收集需要一个将信息从浏览器传送给服务器和CGI程序的安全途径。

举个例子,假设我要通过Internet来销售书。我可能在浏览器上建立一个表单,允许要购书的顾客通过表单提交它的个人信息和信用卡号码。受到这些信息后,我会将它们存储到我的计算机作为商业记录。

如果有人侵入我的商业计算机,那么他可能会访问存放顾客信息和信用卡号码的机密数据。为了避免这种情况,我会审查我的计算机配置安全了,并确定用来接受表单的CGI脚本不会被恶意的操纵。换句话说,我,作为计算机的系统管理员和CGI程序员,要尽力控制住第一个问题:防止信息直接从我的计算机中被窃取。

然而,怎样防止当信息由客户端发往服务器过程中有人中途窃取呢?记住信息怎样由Web服务器传送到CGI程序了吗?信息通过网络由浏览器先传送到服务器,然后服务器将信息传送给CGI程序。这些信息可能在由客户机传送到服务器时被中途窃取(如图2)。注意,为了保护信息使其不会被中途窃取,必须在客户和服务器之间进行加密。当然,如果你的客户机不能识别的话,你不能执行特定CGI的加密。

由于Web处理的特点,使用你独有的单独通过CGI程序实现的安全处理协议的唯一途径是:在表单信息通过浏览器传送到服务器之前将其加密。这个方案如。

之前,发展你自己的安全处理协议几乎是不可能的。感谢Java这样的语言,最近在客户端处理所作的创新,使得这个发展变成可能。 方法是产生一个标准HTML格式扩展的Java接口。当Java的提交按钮被选择时,Java Applet会在利用标准的POST HTTP请求将它发送到Web服务器前先将值加密。

使用Java作为客户机来发送和接收加密的数据将允许你使用自己定制的加密方案,而不需要一个昂贵的商业服务器。


因此,在网络上安全保密地传送数据信息需要调整浏览器和服务器之间的通信路径,有一些是不能仅仅靠CGI就能够控制的。目前有两种加密客户机/服务器信息处理的建议:SSL(Secure Sockets Layer)和SHTTP(Secure HTTP),分别由Netscape和EIT(Enterprise Integrations Technology)提议。关于这点,目前还不清楚哪一个将成为标准;很多公司在他们的服务器中两种都采用了。因此,知道如何在这两者中编写CGI程序是很有用的。

SSL是一个协议独立的加密方案,在网络信息包

[1] [2]  下一页

将本文收藏到QQ书签与更多好友分享