net生活

博客园 首页 新随笔 联系 订阅 管理
  30 Posts :: 0 Stories :: 496 Comments :: 26 Trackbacks
很抱歉﹐这段时间非常忙(项目﹐考试..)﹐所以好长一段时间都没有更新这个系列﹐同时也谢谢大家的关注﹐我会努力写好并完成这个系列的。

 先总结一下web应用程序安全管控的要点﹕

 

1.      在每次客户端请求(Request)时进行安全管控(原因和作法请参考思考2)

2.      安全管控分为认证和授权(二者完全分离﹐单独实现﹐参考思考2的代码示例)

3.      认证即识别请求者是谁(提取用户标识或匿名登录)(作法简单﹐一般采用SessionCookie实现)

4.      授权即判断用户是否有被请求的资源(URL)的权限(本篇解释)

5.      如果没有权限就转入无权处理过程,由它视相关的情形向用户报错(aspxasmx的报错过程应该不一样)

 

要判断用户是否有被请求的资源的权限﹐首先就要知道用户请求的是什么资源。所以我将资源进行抽象﹐并且称它为URLURL预设有3种形式﹐分别是﹕

1.      Request.Path,这是最基本的形式。如:a.aspx , b/b.aspx , ajax/c.ashx

2.      QueryStringRequest.Path﹐这种形式增大了权限管控组件的适应性和灵活性(可参考上一篇的例子)。如 d.aspx?kind=1 , c/e.aspx?ismanage=Y

3.      只到某个目录的Request.Path﹐这种形式方便了某些权限简单的系统使用。如 f/ , g/h/

 

怎样建立URL?

对每个系统功能﹐列出实现这个功能必须要访问哪些程序。如实现系统管理包括manage目录下的所有程序﹐还包括common/listuser.aspx程序﹐还包括adduser.aspx?kind=1这支程序(adduser.aspx?kind=2属于用户管理功能)﹐这样建立三笔URL的数据。

 

用户每次请求时﹐授权模块的工作流程如下﹕

1.      每次用户Request时﹐首先把这个Request通过URL组织模块提取成一个URL字符串。

2.      然后到URL表中抓取相应的URL

3.      找到这个URL属于的系统功能(可能有多个)

4.      依次判断用户ID是否与任一系统功能ID有对应就表示用户有权限。

 

 

 

在上述过程中﹐第1步的URL组织模块组织什么样的URL进去查询最重要﹐组织过程是这样的﹕

1.      默认提取到Request.Path﹐以下为示例代码

String curpath = HttpContext.Current.Request.Path.ToLower().Split(new char[] { '?' })[0].Replace("\\", "/");

2.      查找配置文件﹐是否有这个pathquerystring配置﹐如果有﹐则加入QueryStringcurpath(如配置是/a/b/c.aspx?kind﹐则要在curpath里再加上这个QueryString参数和实际值)

 

2步的查询方式可以通过以下sql代码查询

 

SELECT top 1 (len([Url])) pathlen,url,id

FROM URLM

where '/a/b/c.aspx?kind=1' like Url + '%'

order by pathlen desc

 

假设表中数据为﹕

990001

/a/b

990002

/a/b/c.aspx

990003

/a/b/c.aspx?kind=1

990004

/a

990005

/a/b/d.aspx

990006

/a/d

990007

/a/b/c.aspx?kind=2

 

这样就把最精确匹配给查询出来了,也就是说当前的RequestID990003URL

Pathlen   url         id

18    /a/b/c.aspx?kind=1   990003

 

好了﹐就到这里吧﹐下一篇我将给出所有框架代码﹐也将完成这个系列

posted on 2007-02-01 15:51 Kevin Zou 阅读(2499) 评论(23)  编辑 收藏 网摘 所属分类: asp.net

Feedback

ASP.net2.0(C#)QQ群:16205966
欢迎大家加入

  回复  引用    

#2楼 2007-02-01 16:24 BoyLee      
我喜欢把url过滤到只剩isnumeric的
  回复  引用  查看    

#3楼 2007-02-01 17:59 随心所欲      
1:url不等同于Action。
2:还有很多资源是不会通过url来表现的
3:对于one page app(load usercontrol),或者ajax,或者iframe等判断也不一定准确

  回复  引用  查看    

#4楼 2007-02-01 18:11 Cat Chen      
请求刚刚到达时,或者对于简单的应用,可以说是“一切皆URL”。然而任何一个复杂的系统都无法将信息全部放置在URL中,所以我们有form,然后还有ViewState这样的抽象,单凭URL判断验证与授权就变得不可能了。
  回复  引用  查看    

#5楼 2007-02-01 18:14 jailu      
想了解页面级以下的权限管理如何实现
  回复  引用  查看    

#6楼 2007-02-01 19:59 charleschen      
URL有字数限制的......
  回复  引用  查看    

#7楼 2007-02-01 20:30 tsoukw[未注册用户]
谢谢各位的关注!
首先我要讲的是任何像这种抽象性的解决方案都有其适用范围的,并不是要解决所有问题(如果有这样的东西,我想应该早就有很多类似的产品出来了
我提出的这种web系统的安全管控方案也是如此,它并不能解决所有的web系统的安全和权限管控问题(例如“随心所欲”提到的one page ap)

它适应的环境是企业信息系统,如进销存,ERP以及企业的以数据库中为心的系统等。
这些系统在权限管控方面都有一些共同的特点,如:可让用户分配权限,可让权限动态组合,提供统一分配权限界面等。因此为了适应这种状况,就提出了这个解决方案。

实行这种方案后,我们几乎就再也没有在一个系统开发时考虑过其权限应该怎样实现,而都是通过这种方式解决。对于我们来说,其适用性基本上达到了100%

我想这就是没有最好,只有更好的真正含义
在真正的系统开发时,适合的,能解决问题的就是最好的


  回复  引用    

#8楼 2007-02-01 22:44 Cat Chen      
可否问一句,你的系统中有没有出现过超过256字符的URL?这里256字符指经过UrlEncode的,因为根据W3C规范URL必须是经过UrlEncode的。

如果没有经过UrlEncode,或者超过256字符,那就是一个非法URL。我们都知道很多的浏览器、代理、服务器都兼容非法的URL,然而现实中有些情况它们就是不兼容,例如有些代理服务器一见到非法的URL马上返回请求错误,根本不帮你完成该请求。

  回复  引用  查看    

#9楼[楼主] 2007-02-02 07:40 小生      
@Cat Chen
作為權限管控所用的url,95%的都只會配置到.aspx
如﹕
web應用程式的目錄是﹕http://localhost/webap">http://localhost/webap
那么典型的URL配置是﹕/某某目錄/.../下一層目錄/a.aspx
這個長度一般不會超過50

而且在實際應用中﹐為了在上線時配置url簡單化﹐經常把同一功能的程式寫在一個目錄下﹐這樣配置時只會到目錄﹐如﹕
/某某目錄/某某功能

如果是要適應靈活性﹐那一般也只會再加一個參數(querystring)
如﹕/某某目錄/.../下一層目錄/b.aspx?kind=1

也就是說怎么都不會有超過256個字符的url
除非你的系統的目錄級別很深很深﹗

  回复  引用  查看    

#10楼[楼主] 2007-02-02 07:42 小生      
@Cat Chen
如果没有经过UrlEncode,或者超过256字符,那就是一个非法URL。我们都知道很多的浏览器、代理、服务器都兼容非法的URL,然而现实中有些情况它们就是不兼容,例如有些代理服务器一见到非法的URL马上返回请求错误,根本不帮你完成该请求。

----------------------------
這個好像不是這個解決方案要面臨的問題吧?
如果不使用這種權限管控方案﹐好像也要考慮這個問題喲~~

  回复  引用  查看    

#11楼[楼主] 2007-02-02 07:53 小生      
其實大家沒必要將關注點集中到URL本身上﹐url的字數﹐是否合法和是否使用這種權限管控方案是沒有關系的

它不會對業務系統中的url有任何要求﹐在開發業務系統時也不需要了解權限是如何管控的﹐只要照正常方式開發(當然﹐不需要實現那部分權限管控的功能)

在開發完成后﹐并且能夠完全符合需求運行(只是對于任何程式都不需要權限而已)時﹐再使用這個安全方案時﹐將權限加進去﹐幫助系統實現安全性。

也就是說業務系統不會依賴權限方案
權限方案也不會依賴業務系統
二者在任何時候都是獨立的

  回复  引用  查看    

url长度最长可以支持2k(2048个字节),这个长度是encode后的。
  回复  引用    

对,我以前做paypal的时候,那url的长度长的可怕。。。。
  回复  引用  查看    

没有太仔细看楼主文章,但是一般的权限都是通过cookie,检索里面的会员编号,然后调用web service,检查权限,除非用户能篡改cookie值,否则一般不会有漏洞。另外基于session也好,它要是能匹配到一个相同的cookie中的session_id (guid)值,那我就比较佩服那个作弊的人了。。。
  回复  引用  查看    

#15楼 2007-02-03 09:23 tsoukw[未注册用户]
@在北京的湖南人
其实这个方案的原理也是这样
只不过重点在于怎样检查权限,因为对于一个具体的业务系统,安全管控元件不能知道的太多,所以就以URL为标准来检查

你这么晚还在网上呀?注意休息~

  回复  引用    

#16楼 2007-02-13 08:22 good[未注册用户]
博主的思想不錯
微軟本身的權限管控不就是使用URL嗎(Location的Path)
只不過比較簡單罷了
繼續關注

  回复  引用    

#17楼 2007-05-09 14:12 上善若水      
MemberShip完全可以实现非常复杂的权限控制,也可以完全楼主的功能,只不过楼主的这种功能是以URL为资源模式来管理,在很多情况下并不实用。比如一个页面支持查询,修改,删除这些不同权限的操作,无法通过URL和QueryString来区分,楼主的权限系统就无效了。要用楼主的系统,必须要求系统的整个实现是以URL为粒度来划分系统权限,这也不失为一种方法,比如最后需要某一种操作的时候,都提交到不同的URL。
  回复  引用  查看    

觉得对于一个界面中存在 “查询,修改,删除” 等更加详细的权限,
还可以进一步在URL授权上进行扩展。

  回复  引用  查看    

#19楼 2007-11-13 23:52 aTao[未注册用户]
楼主的文章写得很精彩,但我有两点不太明白:

1.在AuthorizeRequest 事件中是是取不到Session值的(此时,HttpContext.Current.Session为null),不知楼主是在什么地方取到Session["userid"]的;
2."找到这个URL属于的系统功能(可能有多个)",我不太明白如果有多个该如何处理.比如a.aspx对应两个系统功能,而某个用户只有其中一个功能的权限,照你的意思是要两个功能的权限都有才能访问,感觉不是太好.个人感觉应该是一个url对应一个功能,而不应该是多个?


另外,感觉这个系统好像还没完,不知道什么时候可以给个完整的demo代码?

  回复  引用    

#20楼[楼主] 2007-11-17 09:52 小生      
謝謝你的關注﹐這個系列寫得時候有些早﹐現在覺得有些地方不太成熟。思想上應該不會差太遠﹐但是具體實現應該可以更簡單﹐更小巧些﹐所以沒有更新了﹐不好意思﹐有什么問題留言后我會解答的。
1.這個事件Application_PreRequestHandlerExecute應該可以。還有其它一些事件應該也行﹐查一下msdn
2.盡量避免在一支程式有多個功能﹐但是在極少數情況下(實際上不超過1%)﹐兩個功能非常相似時﹐可以用這個解決方案

  回复  引用  查看    

#21楼 2008-02-22 16:59 王孟军!      
20楼你好
在IHttpModule接口里,不能使用Session对象,在IHttpHandler.processRequest()方法中 才开始使用,而且自定义的IHttpHandler还必须实现IRequiresSessionState接口,才能使用Session.

楼主你好
我的项目的权限分配方案 的思路 和你的差不多,
我 获取URL请求的文件的名称,再去匹配 看有没有权限。
至于URL后面的RequestString,我觉得可以不用匹配了,有了URL请求的文件的名称足够了。

  回复  引用  查看    

#22楼[楼主] 2008-02-26 07:44 小生      
@王孟军!
這里是一個Demo代碼﹐我查了一下以前的源碼﹐沒有使用Session﹐是解密cookie來完成的。Sorry...

后面的QueryString主要是有時候我們寫兩支功能時發現代碼几乎一樣﹐因此將兩個權限不同的功能放在一支程式里﹐這時可以通過QueryString來區分一下﹐實際項目中不推荐這樣來完成﹐增加復雜性

  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 637106




相关文章:

相关链接: