自问这个问题以来,.Net和.Net核心的新版本已经删除和/或更改了“代码访问安全性”(CAS)。
我正在研究70-536 .NET Framework - Application Development Foundation Exam,因为我已经编程.net多年了,这应该不难!
然而,我不得不学习“代码访问安全性”(CAS),因为我从来没有需要使用或配置它,我想知道是否有其他人找到了它的真实生活用途?
请提供您何时使用CAS的示例,它已成为解决方案的一部分,而不是问题。
(到目前为止,其他一切都与我在.NET编程中必须完成的任务有一些关系)
相关问题:
到目前为止的结果。
当您托管第三方代码时,CAS非常有用。例如。网络托管公司可以使用它来阻止客户的Asp.net代码对服务器造成损害。 (当.NET用作VBA的替代品时,Office也会使用它)
到目前为止,在Microsoft应用程序之外使用它的唯一详细示例是:
我最近做的一个项目有一些东西 类似:允许用户上传一个 库,并测试它的性能 (“谁做出最好的算法”)。 不用说,我们需要CAS 那里。
CAS似乎对获得JITDC认证非常有用,就像美国国防部一样,但是我不知道CAS是否具有任何实际价值,或者它是否只是盒装滴答声。
(如果您需要绕过使用CAS的主机,并且您拥有该计算机的管理员权限,则可以将您的程序集放在GAC中。)
展望未来,CAS is a bit less complex in .net 4。
至少看起来新的Microsoft考试不会有包含CAS的“基础”考试。我不知道它是否会进入新的Winforms / WPF考试。
答案 0 :(得分:35)
我经常在“现实世界”中遇到代码访问安全性,通常是在我最不期望的时候。在某种程度上,SilverLight将是一个非常好的真实世界应用程序,它最终不是SilverLight chose not to employ CAS。
您在行动中看到的地方是需要安全环境的地方:ASP.NET当然,但ASP.NET托管服务提供商使用修改后的安全模型来防止其宝贵的入侵系统。我知道Webhost4Life使用了这个(在他们的网站上没有关于它的信息,但我和他们一起工作,它确实存在)。进一步看,其他ASP.NET托管提供商也这样做,但他们也不是很清楚:thread on godaddy.com not想要更改CAS(并且不清楚支持什么和不支持)或this related discussion on 1&1。一些云托管站点(rackspacecloud)更进一步,“与Microsoft一起工作,修改完全信任级别”无论可能是什么。
简而言之:如果您找到一个ASP.NET主机,很可能他们使用CAS来阻止您做他们不希望您做的事情。他们甚至可以使用它来区分“基本”(许多限制)托管和“企业”(少数限制)托管,这给CAS提供了另外一种意义。
我自己遇到的一些现实世界的情况太多了。我最近的一个项目有类似的东西:允许用户上传一个库,并测试它的性能(“谁制作最好的算法”)。不用说,我们在那里需要CAS。其他示例或有趣的资源:
对于您自己完全控制的任何情况,您构建自己的应用程序和代码(或构建它)并完全控制您的系统,我认为您不会经常需要CAS。当您从较不受信任的来源运行代码时,您可以使用更多的东西(基本上所有这些都不在您完全控制之下)。
默认CAS设置限制从网络共享或其他非本地源运行的代码的功能。这是有道理的,但严格的限制使得很难拥有分布式应用程序的中央存储库。 .NET 2.0引入了ClickOnce,它本应提升安全性(discussion here)。
ClickOnce本身uses CAS,以防止安装程序调用系统函数。因此,我认为它可以说是最依赖CAS 的知名应用程序。
重点是:你需要了解CAS能够创建可以直接从共享运行的东西,或者你忽略它并使用ClickOnce。
2005年,微软summoned a survey找出CAS为何如此不受欢迎,希望改进它以使其更适用。不幸的是,我找不到实际的调查结果,除了this post somewhat detailing,为什么CAS未被充分利用。
更新: 关于Unix / Linux中CAS作为BitFrost的部分和调查部分。
更新:添加了CAS与ClickOnce部分
更新:使用CAS添加资源列表(并连续为所有这些更新道歉!)
答案 1 :(得分:10)
从技术上讲,它非常有用,因为它允许非常精细的权限规范。这对你有好处(理论上它会使得利用安全漏洞变得更加困难 - 即使攻击者完全控制你的应用程序,他仍然被锁定在CAS沙箱中)和你的客户(因为他们可以确切地看到你的应用程序可以执行并运行自己的安全审核。)
在实际使用中,它几乎毫无意义。我认为它太复杂了,可用的开发工具支持的太少,大多数用户都不关心。
当然也有例外(政府和客户真正了解.net / CAS),我很乐意说CAS绝对有用且强制性,但现实中说的是一种清晰的语言。
答案 2 :(得分:5)
读者注意:见下面的两条评论;听起来我不小心将CAS的定义夸大到(错误地)包括RBS。我会在这里留下答案供参考,但要注意区别。
CAS有两个问题;你会在那次考试中看到最重要的东西是调用其他代码的代码的细微差别,可能对部分信任有用,但大部分时间它都是只是一种痛苦 - 更糟糕的是:如果你的代码完全信任(大多数/太多的话)没有实际执行(它完全被跳过)。
CAS RBS的有用的部分是主要权限, 使用;当然,您的UI应该验证对功能的访问权限,但是您可以(使用低位逻辑):
[PrincipalPermission(SecurityAction.Demand, Role = "ADMIN")]
static void DeleteOrder(int id) { ... }
即使完全信任,也会强制执行;您可以通过实施IPrincipal
来定义自己的主体(与用户相关联)(请查看IsInRole()
)。由于大多数环境(winforms,webforms,mvc,wcf等)支持主体,因此可以非常灵活地在业务层上仔细检查安全性,而无需引用特定的安全模型。请注意,上述检查可以在任何环境中使用。
您也可以使用它来驱动您的UI。我确实有一个usenet帖子,它根据主体启用/禁用winforms控件(使用运行时属性来指定每个控件的角色,有点像ToolTip
等) - 虽然我无法在一分钟内找到它(编辑:maybe this one)。
答案 3 :(得分:2)
对代码访问安全性的理解是,它对应用程序开发人员的用处非常少,除了了解它的使用方式以及您可能正在调用的API的权限级别。我唯一有用的例外是一个名为PrincipalPermission的CAS,如果没有为当前的Principal定义正确的Role,它基本上不允许执行某些代码。看到这篇文章:
http://www.coderjournal.com/2008/03/securing-mvc-controller-actions/
真正需要关注CAS的开发人员以及应该如何在他们的应用程序中实现它的是框架和代码库开发人员。因为您需要某些级别的信任才能使您的应用程序工作,尤其是在处理非托管资源(如文件,网络流,串行端口等)时。或者,如果您要创建非托管资源的代码,例如某些非特定资源。服务器或对程序集的任何类型的低级访问,您将希望围绕它创建一些代码访问安全性,以便不允许人们执行严格拒绝的内容。
微软并没有真正做到这么好的工作,解释如何在每天的应用程序中使用CAS。所以这才是缺乏使用的原因。然而,CAS是.NET是一种安全语言的众多原因之一,其问题比竞争对手少得多。
答案 4 :(得分:2)
我是一个项目的开发主管,负责获得JITC certification(美国国防部)基于.NET的解决方案,并且在认证测试期间对CAS设置进行了非常密切的审查。
与大多数其他认证要求一样,代码只能使用工作所需的权限,而不再需要。
如果您计划获得安全认证,CAS肯定很重要。
答案 5 :(得分:1)
您应该知道的一件事是代码访问安全性作为防篡改的方法几乎被打破。参见:
CAS Tamper-Proofing is Broken: Consequences for Software Licensing
...
无法再依赖代码访问安全性来防止在发货的产品中使用篡改组件。这意味着,如果您的应用程序依赖于代码访问安全性来执行许可检查,则攻击者可以将许可程序集替换为另一个许可程序集,从而可以免费访问您的应用程序。
...
答案 6 :(得分:1)
虽然我从未使用它,但我对CAS的理解是它也可以用来扩展面向对象的设计机制。例如,假设您正在为必须实现数据库访问和缓存的银行开发大量数据访问包。尽管它们是同一部署包的一部分,但考虑到项目的假设大小,逻辑应该在单独的程序集中实现,因为它们是完全不同的问题集,它们依赖于不同的外部力量(数据库基础架构与消费者使用)。 p>
但是,缓存代码可能需要访问数据访问程序集中的某些敏感类或方法,而整个程序包的使用者不应该访问这些类或方法。因此,这些数据访问类和方法不能简单地为public
。具有缓存程序集中的子类的数据访问程序集中的受保护方法可以解决某些情况,但通常是滥用继承。将public
的LinkDemands放置在调用者上以获得管理员只授予缓存程序集的自定义权限(例如DataPackagePermisson
)可能会更优雅。
答案 7 :(得分:0)
我们为我们的应用程序使用CAS并不是很难,因为我们只是试图阻止未经验证的代码执行。一旦使用我们的软件从本地网络共享出现问题,但是cas-policy清除了问题。
自.NET3.5更新以来,我们的问题不再存在,因为局域网上的代码现在像本地代码一样处理。