关于web应用程序安全的思考(一)
2008-11-26 13:35:59 来源:WEB开发网曾经有人设计过这样一个系统﹐要我尝试攻入其中某个已管控的页面中。
它是这样做的﹐在每个要权限的aspx页面的page_load中判断Session["userid"]是否为null,如果不是﹐则转向登录页面。
在我截获了网络上某个已登录用户和web服务器通讯的request和response之后﹐提取其cookie信息﹐交将它放入我的request请求中﹐我就以那个登录用户的身份执行了那支程序了。
但是这并不是说就不能使用cookie和session来作为认证的机制﹐我的意思是﹐web应用程序的安全也是相对的﹐必须建立在基本的网络安全和用户安全防范意识之上。可以采取包括加密会关键页面(如登录页面)的会话(例如使用https)或要求用户每次使用完系统后注销或关闭浏览器﹐以及尽可能多的对cookie和session做更多验证等。
在认证和授权的原理讲完后﹐要在asp.net应用程序中要完成上述的安全管控其实非常简单﹐设计一个httpmodule﹐然后捕获相关的事件﹐在这个事件中进行权限判断即可。
下面是一些框架代码﹕
1 /**//// <summary>
2 /// 使用HttpModule模组进行web权限管控
3 /// </summary>
4 /// <remarks>
5 /// 自定义一个HttpModule﹐并在AuthorizeRequest事件中完成授权动作
6 /// </remarks>
7 public class WebSecurityModule:IHttpModule
8 {
9
10
11
12 /**//// <summary>
13 /// 在AuthorizeRequest事件中,进行验证和授权
14 /// </summary>
15 /// <param name="context"></param>
16 public void Init(HttpApplication context)
17 {
18context.AuthorizeRequest += new EventHandler(OnAuthorize);
19 }
20
21 /**//// <summary>
22 /// 调用PFSAuthorize类进行授权
23 /// </summary>
24 /// <param name="sender"></param>
25 /// <param name="e"></param>
26 /// <remarks>主要是看当前用户(包括匿名用户)是否拥有当前Request的url的权限</remarks>
27 public void OnAuthorize(Object sender,EventArgs e)
28 {
29 //认证﹕提取用户ID
30 string userid = getuserid();
31 //授权﹕判断用户ID是否有URL的权限
32 bool hasright = authroize(userid,HttpContext.Current.Request.Url);
33 if (!hasright)
34 {
35 //进行无权信息返回
36 //如转向无权登录页面
37 Response.Redirect("error.aspx");
38 }
39 }
40 }
最后我们只要将这个类封装成一个单独的DLL﹐然后在每个web.config的httpmodules节中配置即完成了安全管控
后面的文章我会讲如何设计这些模块达到最好扩展性
更多精彩
赞助商链接