发信人: yhjgl(缘梦)
整理人: dongbao(2001-04-29 16:50:53), 站内信件
|
10 使用身份验证机制保护被限制的 ASP 内容
可以要求每个试图访问被限制的 ASP 内容的用户必须要有有效的 Windows NT帐号的用户名和密码。每当用户试图访问被限制的内容时,Web 服务器将进行身份验证,即确认用户身份,以检查用户是否拥有有效的 Windows NT 帐号。
Web 服务器支持以下几种身份验证方式:
基本身份验证 提示用户输入用户名和密码。
Windows NT 请求/响应式身份验证,从用户的 Web 浏览器通过加密方式获取用户身份信息。
然而,Web 服务器仅当禁止匿名访问或 Windows NT 文件系统的权限限制匿名访问时才验证用户
11 保护源数据库
访问源数据库的 ASP 脚本需要 Web 服务器所运行的计算机的管理员权限。在从远程计算机上运行这些脚本时,须经已通过身份验证的连接,如使用 Windows NT 请求/响应验证方式进行连接。应该为管理级 .asp 文件创建一个服务器或目录并将其目录安全验证方式设置为 Windows NT 请求/响应式身份验证。目前,仅 Microsoft Internet Explorer version 2.0 或更高版本支持 Windows NT 请求响应式身份验证。
12 使用 SSL 维护应用程序的安全
SSL (Secure Sockets Layer)协议是由Netscape首先发表的网络资料安全传输协定,其首要目的是在两个通信间提供秘密而可靠的连接。该协议由两层组成,底层是建立在可靠的传输协议(例如:TCP)上的是SSL的记录层,用来封装高层的协议。SSL握手协议准许服务器端与客户端在开始传输数据前,能够通过特定的加密算法相互鉴别。SSL的先进之处在于它是一个独立的应用协议,其它更高层协议能够建立在SSL协议上。
SSL3.0 协议作为 Web 服务器安全特性,提供了一种安全的虚拟透明方式来建立与用户的加密通讯连接。SSL 保证了 Web 内容的验证,并能可靠地确认访问被限制的 Web 站点的用户的身份。
通过 SSL,您可以要求试图访问被限制的 ASP 应用程序的用户与您的服务器建立一个加密连接;以防用户与应用程序间交换的重要信息被截取。
比如好多基于WEB的ASP论坛都会提供注册用户互相发送信息的服务,这种信息是明文传送的,如果在网吧就很容易给人监听到。如果加了一层SSL认证,就会防止发送信息被监听的可能。
13 客户资格认证
控制对您的 ASP 应用程序访问的一种十分安全的方法是要求用户使用 客户资格登录。客户资格是包含用户身份信息的数字身份证,它的作用与传统的诸如护照或驾驶执照等身份证明相同。用户通常从委托的第三方组织获得客户资格,第三方组织在发放资格证之前确认用户的身份信息。(通常,这类组织要求姓名、地址、电话号码及所在组织名称;此类信息的详细程度随给予的身份等级而异。)
每当用户试图登录到需要资格验证的应用程序时,用户的 Web 浏览器会自动向服务器发送用户资格。如果 Web 服务器的 Secure Sockets Layer (SSL) 资格映射特性配置正确,那么服务器就可以在许可用户对 ASP 应用程序访问之前对其身份进行确认。
作为 ASP 应用程序开发人员,您可以编写脚本来检查资格是否存在并读取资格字段。例如,您可以从资格证明中访问用户名字段和公司名字段。Active Server Pages 在 Request 对象的 ClientCertificate 集合中保存资格信息。
必须将 Web 服务器配置为接受或需要客户资格,然后才能通过 ASP 处理客户资格;否则,ClientCertificate 集合将为空。
14 ASP的加密
由于ASP脚本是采用明文(plain text)方式来编写的,所以应用开发商辛苦开发出来的ASP应用程序,一旦发布到运行环境中去后,就很难确保这些"源代码"不会被流传出去。这样就产生了如何有效地保护开发出来的ASP脚本源代码的需求。
官方加密程序:从微软免费下载到sce10chs.exe 直接运行即可完成安装过程。安装完毕后,将生成screnc.exe文件,这是一个运行在DOS PROMAPT的命令工具。
运行screnc - l vbscript source.asp destination.asp生成包含密文ASP脚本的新文件destination.asp用记事本打开看凡是"<%和%> "之内的,不管是否注解,都变成不可阅读的密文了,但无法加密中文。
几种ASP源代码保护方法:
1,"脚本最小化"即ASP文件中只编写尽可能少的源代码,实现
商业逻辑的脚本部分被封装到一个COM/DCOM组件,并在ASP脚
本中创建该组件,进而调用相应的方法(methed)即可。应用开发者
动手开发ASP脚本应用之前就可按此思路来开发,或者直接用ASP
脚本快速开发出原型系统后,针对需要保护、加密的重要脚本用
COM/DCOM组件来重新开发、实现并替换。
2,"脚本加密"即ASP脚本仍直接按源代码方式进行开发,但在发布到运行环境之前将脚本进行加密处理,只要把加密后的密文脚本发布出去。即在ASP.DLL读取脚本这个环节加入密文还原的处理。实现这种思路的方法有两种:一是自行开发一个ISAPI的IIS过滤(filter)块,在ASP.DLL之前勾连(hook)对ASP脚本文件的读取,以便把文件系统读出的密文还原成ASP.DLL可以解释的明文;
方法二是直接由ASP.DLL提供对ASP脚本加密处理的支持。微软在新版本的Vbscript.dll jscript.dll中提供这种成为MS script encode技术的支持。这样,无论是客户端的Vbscript jscript(包括WSH脚本等),还是服务器端的Vbscript jscript (即ASP脚本)都可以支持加密处理。
MS script encode 技术具体的实现思路包括以下两个方面:一是加密过程,通过提供一个实用程序对包含ASP脚本源代码的文本文件进行扫描,找出其标记为<script language="vbscript.encode">或<script language = "Jscript.encode">;二是还原过程,IE或ASP.DLL等执行脚本时是统一通过Vbscript.dll jscript.dll来解释执行的,所以它们都能同时地、透明地支持明文和密文的脚本。
总之,如果采用第一种思路,要么就自行在开发过程中遵照进行,要么可以考虑选择自动转换成visual basic 编译代码的通用的、实用工具;采取第二种思路的化,要么就自行开发IIS ISAPI过滤模块,要么可以考虑直接采用MS script encode软件。
下面来看看一种ASP可以使用的简单字符加密算法,而不是那些受限制的加密算法。其实,这里介绍的加密算法对于一般的运用来说已经足够解密人麻烦一阵子的了。它的加密基础是最简单的Vernum密码方法,它的基本原理是,需要有一个需要加密的明文和一个随机生成的解密钥匙文件。然后使用这两个文件组合起来生成密文。
(明文) 组合 (密钥) = 加密后的密文
所以这里介绍的是生成密钥的代码。我们假设我们生成的密钥为512位长的密钥,它已经足够来加密一个文本字符了。代码如下:
KeyGeN.asp文件
<%
'******************************
' KeyGeN.asp
'******************************
Const g_KeyLocation = "C:\key.txt"
Const g_KeyLen = 512
On Error Resume Next
Call WriteKeyToFile(KeyGeN(g_KeyLen),g_KeyLocation)
if Err <> 0 Then
Response.Write "ERROR GENERATING KEY." & ""
Response.Write Err.Number & "
"
Response.Write Err.Description & "
"
Else
Response.Write "KEY SUCCESSFULLY GENERATED."
End If
Sub WriteKeyToFile(MyKeyString,strFileName)
Dim keyFile, fso
set fso = Server.CreateObject("scripting.FileSystemObject")
set keyFile = fso.CreateTextFile(strFileName, true)
keyFile.WriteLine(MyKeyString)
keyFile.Close
End Sub
Function KeyGeN(iKeyLength)
Dim k, iCount, strMyKey
lowerbound = 35
upperbound = 96
Randomize ' Initialize random-number generator.
For I = 1 to iKeyLength
s = 255
k = Int(((upperbound - lowerbound) + 1) * Rnd + lowerbound)
strMyKey = strMyKey & Chr(k) & ""
next
KeyGeN = strMyKey
End Function
%>
在IIS下运行上面的KeyGeN.asp页面。你只需要如此做一次,他将把密钥写入文件c:\key.txt中 (如果你愿意的话,你也可以把这个文件放到另外一个更加安全的地方),然后你可以打开这个key.txt文件,它将包含512个ASCII码在35到96之间的字符。并且由于是随机生成的,所以每个人的私人密钥文件key.txt将是不一样的,下面是一个例子密钥文件:
IY/;$>=3)?^-+7M32#Q]VOII.Q=OFMC`:P7_B;#,+.AW_/+')DIB;2DTIA57TT&-]O'/*F'M>H.XH5W^0Y*=71+5*^`^PKJ(=E/X#7A:?,S>R&T;+B#<:-*\@)X9F`_`%QA3Z95.?_T#1,$2#FWW5PBH^*<))A(S0@AVD8C^Q0R^T1D?(1+,YE71X+.*+U$:3XO^Q).KG&0N0);[LJ
下面再仔细分析一下上面的程序,我们发现其中的lowerbound和upperbound的数值
其实就是你想使用来加密的ASCII字符范围。
下面的代码将介绍如何使用这个密钥来加密和解密一个字符串
Crypt.asp文件
<%
Dim g_Key
Const g_CryptThis = "Now is the time for all good men to come to the aid of their country."
Const g_KeyLocation = "c:\key.txt"
g_Key = mid(ReadKeyFromFile(g_KeyLocation),1,Len(g_CryptThis))
Response.Write "ORIGINAL STRING: " & g_CryptThis & "
"
Response.Write "
KEY VALUE: " & g_Key & "
"
Response.Write "
ENCRYPTED CYPHERTEXT: " & EnCrypt(g_CryptThis) & "
"
Response.Write "
DECRYPTED CYPHERTEXT: " & DeCrypt(EnCrypt(g_CryptThis)) & "
"
Function EnCrypt(strCryptThis)
Dim strChar, iKeyChar, iStringChar, I
for I = 1 to Len(strCryptThis)
iKeyChar = Asc(mid(g_Key,I,1))
iStringChar = Asc(mid(strCryptThis,I,1))
' *** uncomment below to encrypt with addition,
' iCryptChar = iStringChar + iKeyChar
iCryptChar = iKeyChar Xor iStringChar
strEncrypted = strEncrypted & Chr(iCryptChar)
next
EnCrypt = strEncrypted
End Function
Function DeCrypt(strEncrypted)
Dim strChar, iKeyChar, iStringChar, I
for I = 1 to Len(strEncrypted)
iKeyChar = (Asc(mid(g_Key,I,1)))
iStringChar = Asc(mid(strEncrypted,I,1))
' *** uncomment below to decrypt with subtraction
' iDeCryptChar = iStringChar - iKeyChar
iDeCryptChar = iKeyChar Xor iStringChar
strDecrypted = strDecrypted & Chr(iDeCryptChar)
next
DeCrypt = strDecrypted
End Function
Function ReadKeyFromFile(strFileName)
Dim keyFile, fso, f
set fso = Server.CreateObject("Scripting.FileSystemObject")
set f = fso.GetFile(strFileName)
set ts = f.OpenAsTextStream(1, -2)
Do While not ts.AtEndOfStream
keyFile = keyFile & ts.ReadLine
Loop
ReadKeyFromFile = keyFile
End Function
%>
在Crypt.asp中我们首先从密钥文件中得到密钥值,然后从这段密钥中截取和我们需要加密的明文同样长度的密钥。然后使用一个简单的异或操作将明文和密钥进行运算,那么得到的结果就是加密后的密文了。过程很简单的。由于是使用了异或操作,所以解密将非常简单,只要使用同样的密钥对密文再次进行异或操作就能够解密了。在上面介绍的基础上,你可以少加改动,就可以使用同样的方法加密一个文件。唯一需要注意的是,对于一个二进制文件,你需要做一些完整性检查以保证转换回来的字符不要越界。
现在你需要做的就是把密钥保存在服务器上的一个安全的地方(不能够被外部访问)
15 SQL SERVER的安全性
目前用ASP编写的WEB应用中,后台数据库大部分SQL SERVER。SQL SERVER相对来说比较安全。但是也要小心地配置SQL Server。
1 安装远程数据库管理有风险
SQL Server支持从远程进行数据库的维护。在安装时你可以选择不安装,安装完成以后,你还可以通过"SQL Server Network Utility"来删除远程管理。如果你要使用远程管理,请使用TCP/IP,并将缺省的端口1433改变为其他的数值。使用远程对你可能比较方便,便是请注意一个hacker只要知道你的SQL server密码,就可以进入你的数据库。
2 改变sa的密码
缺省安装时,SQL SERVER的sa账号的密码为空,建议你在Enterprise SERVER中,改变sa的密码。
3 数据库登录账号不要写入ASP页面中。
16 使用最新的扫描器扫描ASP漏洞
目前可以扫描IIS漏洞的扫描器有很多,比较有名的有ISS,CIS和gnit等。下面我们以GNIT为例子。
GNIT是个功能很强的漏洞扫描器,能扫描NT的用户名和相关信息列表,扫描IIS的漏洞。
在WINNT的DOS模式下打下:
gnit <对方IP>
比如:gnit 172.1.1.1
GNIT开始扫描端口,从上图可知目标主机提供了HTTP,FTP,SMTP等
|
|