手把手教会你如何用 ASP 和 IIS 设置目录安全的七个方法 |
||||
前言
首先,协策本文的编码已经经过测试并取得成功,可以在 Windows 2000 Server 的 Internet Information Services (IIS)5.0 中运行。
该 Web 站点在装有 Windows 2000 的机器上。由于在这样的环境下, IIS 与 Windows 完全结合在一起,因此,我决定好好利用这种鉴别机制。当用户进入最开始的页面时, LOGON_USER 环境变量通常会得到该用户的详细信息。由于 Windows 对鉴别用户和向用户授权都格外谨慎,我们唯一需要费神的是决定当前登录的用户该从哪里获取文件信息。由于这个方案中不存在数据库的交互作用,因此我的这个程序采用的是 XML 文件,这些文件可以长久保持用户信息。 XML 数据会被长久保持在应用程序变量中,如果这个应用程序 XML 数据发生了任何改变,也都会被长久地保持在该 XML 文件中。当然,这个例子中,唯一长久保持的是当前登录的用户的鉴定信息。这也就是当前用户的 SessionID 。
为了让这些文件夹更灵活,我想允许用户以个人用户或群体用户的身份都可以访问它。这就要求这些文件夹向个人用户和群体用户提供访问路径,而且这些信息要储存在 XML 文件中。这样一来,我们需要三个 XML 文件:一个为个人用户准备的,一个为群体用户,另一个为文件夹准备。
用户的 XML 文件包含用户的一些信息。例如,每个登录的用户都有一个用户名。当某个用户访问该 Web 站点时,就创建了一个会话,会话标志符可以识别这个会话。由于每一个会话对应一个用户,那么鉴别用户的用户节点就包括一个 sessionId 属性,用来保存当前的会话标志符。 SessionId 属性可以用来在访问信息中查找用户的 ID 。这时,你同样需要为用户准备一个默认的文件夹。图表 A 中包含了一个用户 XML 文件的例子。
图表 一
<?xml version='1.0'?>
图表 二
<?xml version='1.0'?>
文件夹的 XML 文件包含了准许个人用户访问的所有必要信息。每一个文件夹节点包括一个清单,列出准许浏览该文件夹内容的用户。文件夹节点还为该文件夹指定了一个昵称 - -为了保护该文件夹的真实身份 - 还有一个到达服务器上的物理文件夹的完全路径。图表 三 包含了该文件夹的 XML 文件的例子。
图表 三
<?xml version='1.0'?> 当用户登录到 Web 站点时,他被“指定”到他的默认文件夹。这个文件夹会显示所有可利用的文件和可访问的文件夹, 将所有的碎片连缀起来 首先,用户必须登录到系统。一个普通的登录页面会提供一些方法,提示用户的标志符。由于我不希望 Windows NT 鉴定变得混乱,所以我会要求用户通过基本的鉴定来提供他们的标志符。你可以通过将 Response status 设置成“ 401 未授权”并加上标题:“ WWW-Authenticate: Basic ”来完成这一步。浏览器接受到这个信息后,会自动提供一个登录窗口,让用户输入他的用户名和密码。当用户输入这些并提交这些信息后, IIS 会通过用户所提供的标志符自动鉴别用户。
基本的鉴定会将识别信息以纯文本的格式发送给服务器,了解这一点对我们很重要。有人建议任何实行这种鉴定机制的方法都通过 SSL 来执行,这样有助于避免出现安全问题。同样,管理员要让基本的鉴定在登录页面中能得以完成 ( 通常都是通过 Internet Services Manager) 。 ( 访问 微软的网页 可以看到更多关于使用 Windows 2000 进行鉴定的信息。 ) 当 ( 或者说如果 ) 用户鉴定完成了, LOGON_USER 环境变量也就设置成功了。在登录过程中,这些资料可以被特定的用户节点用来查询用户的 XML 。
如果用户已经登录成功了,这时就要设置 sessionId 属性了。如果当前的 SessionID 也就是 sessinID 属性值的话,你可以通过查找用户的节点来校验它。如果找不到这个节点,你可以设置 sessionID 属性,保持 XML 数据,将用户导入到它们的默认文件夹,这样用户也可以成功登录了。图表 四 包含了完成这一步的编码。
图表 四 <%
Option Explicit
Dim xmlUsers
Set xmlUsers = Server.CreateObject("MSXML2.DOMDocument.4.0") xmlUsers.async = False
If VarType(Application("users")) = 0 Then
Else
End If
Dim oUser
Set oUser = xmlUsers.selectSingleNode("users/user[@sessionId='" &
If oUser Is Nothing And Request.ServerVariables("LOGON_USER") = "" Then
Else If Request.ServerVariables("LOGON_USER") <> "" Then
End If
Private Sub Login(strUserName)
Application.Lock
End Sub
Private Sub RequestAuthenticate()
%>
<html>
<body>
<h1>You are not authorised to view this page.</h1>
</body>
</html>
<%
End Sub
%>
以上编码假设以下情况: users.xml 文件位于该站点的根目录下,这样,这个编码才能运行;而且当前登录的用户必须看过这个文件的用户须知。由于该文件是在该站点的根目录下,这就存在着一些安全隐患。如果你将这个文件移到另一个地方,例如根目录的上级目录,用户就不能通过一个普通的 URL 查看这个文件。同样在,只要这个站点不在一个 Web farm 上,这个编码就可以运行。要处理这种情况,必须确保 users.xml 文件存在于一个共享目录中,这个目录在任何一台服务器之间共享,而且你必须选择使用除 SessionID 以外的安全机制,诸如保存在 cookie 中的 generated GUID 。尽管如此,这一方法被认为是一种简单的单服务器方案。这个编码被保存在一个名为 Security.asp 的文件中。
用户登录成功以后,他会被导入到 GetFiles.asp 下面。这个页面会显示该用户可以访问的所有文件和文件夹的链接。 Getfiles.asp 会进行检查,以确定是否有当前登录的用户。如果没有的话,浏览器会返回到 Security.asp 页面。如果有的话,这个页面会检查用户注册时所填写的文件夹规范和昵称是不是有效。如果无效,系统会给该用户提供他们的默认文件夹里的文件夹和文件。如果有效的话,该用户有权访问的当前文件夹里的文件和文件夹都会丢失。该用户可以点击任何文件来重新找回这个文件,或者点击文件夹来浏览里面的内容。图表 五 包含了完成这一步的编码。 图表 五
<%
Option Explicit
Dim xmlFolders, xmlGroups, xmlUsers
Set xmlFolders = Server.CreateObject("MSXML2.DOMDocument.4.0")
Set xmlGroups = Server.CreateObject("MSXML2.DOMDocument.4.0")
Set xmlUsers = Server.CreateObject("MSXML2.DOMDocument.4.0")
If VarType(Application("folders")) = 0 Then
Else
End If
If VarType(Application("groups")) = 0 Then
Application.UnLock
Else
End If
If VarType(Application("users")) = 0 Then
Else
End If
Dim oUser Set oUser = xmlUsers.selectSingleNode("users/user[@sessionId='" &
If oUser Is Nothing Then _
Dim sFolder
If VarType(Request("friendlyName")) = 0 Then
Else
End If
Private Sub ShowFilesAndFolders(sFolderSpec)
Dim fso, root, file, folder
%>
<html>
<head>
<script language="JavaScript" src="/_ScriptLibrary/getfiles.js"></script>
</head>
<body>
<%
"</a><br>"
Next
%>
<form method="post" name="thisForm"><input type="hidden"
name="friendlyName"></form>
<form method="post" name="thatForm" action="GetSecureFile.asp"><input
</body>
</html> <%
Set fso = Nothing
End Sub
Private Function IsUserOkay(sFolderSpec)
xmlFolders.selectSingleNode("folders/folder[@friendlyName='" & sFolderSpec &
'This folder doesn't even exist in XML
'Check user's permissions by user id and group id
oFolder.selectSingleNode("users/user[@type='user'][@id='" & userId & "']")
Else
End Function
%>
当用户看到这个页面时,他们通常会点击某个文件或文件夹。该链接的 Onclick 事件管理者会将必要的资料传送给服务器。这个事件管理者在 getfiles.js 文件中,在图表 六 中你可以看到。
图表 六
functionopenFolder(obj) {
function openFile(obj) {
当用户点击一个文件夹,该页面会将昵称设置为隐藏,并提交该窗体。这些信息会被提交到 GetFiles.asp 页面。为了确保一切顺利,当用户点击某个文件时,另一个名为 GetSecureFile.asp 的文件会负责传送这个文件。 GetSecureFile.asp 会再次检查用户的安全信息,如果安全的话,然后会以八个字节为单位将这些字节串传送这些文件。在图表 七 中你可以看到这一步的一些编码。
<%
Option Explicit
Dim xmlUsers
Set xmlUsers = Server.CreateObject("MSXML2.DOMDocument.4.0")
If VarType(Application("users")) = 0 Then
Else
End If
Dim oUser
Set oUser = xmlUsers.selectSingleNode("users/user[@sessionId='" &
If oUser Is Nothing And Request.ServerVariables("LOGON_USER") = "" Then
Else
End If
Private Sub Login(strUserName)
Application.Lock
End Sub
Private Sub RequestAuthenticate()
%>
<html>
<body>
<h1>You are not authorised to view this page.</h1>
</body>
</html>
<%
End Sub
%>
您可能感兴趣的文章推荐 |
||||
|