`

CAS 代码访问安全性二 (翻译)

阅读更多

试一下下面的代码,我们之前没有使用security命名空间,但是我们现在来用用看。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->using System.Security;
using System.Security.Permissions;

添加另一个button到已经存在的form上。


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->private void btnFileRead_Click(object sender, System.EventArgs e)
{
    
try
    {
        InitUI(
1); 
    }
    
catch (SecurityException err)
    {
        MessageBox.Show(err.Message,
"Security Error");
    }
    
catch (Exception err)
    {
        MessageBox.Show(err.Message,
"Error");
    } 
}

InitUI只是调用ShowUI函数。记住它已经被拒绝了对c盘的读操作。


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->// Access is denied for this function to read from C: drive
// Note: Using declrative syntax
[FileIOPermission(SecurityAction.Deny,Read="C:\\")]
private void InitUI(int uino)
{
    
// Do some initializations
    ShowUI(uino);    // call ShowUI
}

ShowUI函数得到uino显示适当的UI


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->private void ShowUI(int uino)
{
    
switch (uino)
    {
        
case 1// That's our FileRead UI
            ShowFileReadUI();
            
break;
        
case 2:
            
// Show someother UI
            break;            
    }
}

ShowFileReadUI显示与读文件有关的UI

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->private void ShowFileReadUI()
{
    MessageBox.Show(
"Before calling demand");
    FileIOPermission myPerm 
= new 
      FileIOPermission(FileIOPermissionAccess.Read, 
"C:\\");
    myPerm.Demand();
       
// All callers must have read permission to C: drive
      
// Note: Using imperative syntax
      
    
// code to show UI
    MessageBox.Show("Showing FileRead UI");
    
// This is excuted if only the Demand is successful.
}

我知道这是一个槽糕的例子,但是它已经足够了。

现在运行我们的代码。你会得到一个“Before calling demand”的消息,然后跳出一个自定义的错误对话框“security error”。哪里错了呢?看下面的图片:


【图11

我们已经禁止了InitUI方法的读的权限。所以当ShowFileReadUI请求对c盘的写的权限的时候,它检查堆栈的时候找到不是每个调用者都被允许这个demanded permission,显示一个异常。只需要注释在InitUI方法里面注释Deny statement 它就可以工作了,因为所有的调用者都有demandedpermission

 

注意,根据文档,许多.NET Framework的类已经有了demands关联它。例如StreamReaderStreamReader自动需要FileIOPermission.所以用其他demand去替换它会导致一个堆栈的错误。

Link Demand

一个link demand只检查你的代码的直接调用者。那意味者它不会对堆栈起作用。当你的代码跳到一个典型的引用,包括函数指针引用和方法调用会发生link。一个link demand只能用申明的方式。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->[FileIOPermission(SecurityAction.LinkDemand,Read="C:\\")]
private void MyMethod()
{
    
// Do Something 
}

Inheritance Demand

Inheritance Demand能过被类和方法应用。如果它用到一个类上,所有从它继承的类都具有它的permission

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->[SecurityPermission(SecurityAction.InheritanceDemand)]
private class MyClass()
{
    
// what ever
}

如果它用到一个方法上,所有继承它的类必须制定permission去重写那个方法。


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->private class MyClass()
{
    
public class MyClass() {}
    
    [SecurityPermission(SecurityAction.InheritanceDemand)]
    
public virtual void MyMethod()
    {
        
// Do something
    }
}

就像link demandinheritance demand也只能用声明的方式。

Requesting Permissions

想象一个场景。你给一个用户一个form其中包含有20多个field去填充,所有的信息必须保存在一个text文件中,用户填充了所有的信息,当他要保存的时候,他得到了一个信息,他没有足够的权限去创建一个文件。当然你可以试图沉静的告诉他为什么会发生这个,因为我们调用堆栈的时候...因为一个demand。。如果你足够幸运,你可以从microsoft那得到这个警示(相信我...有时他确实会发生)。

 

你在装载装配的时候请求permission的优先级是否比较容易呢?这里有3种方法去做他在CAS中。

  • RequestMinimum

  • RequestOptional

  • RequestRefuse

注意这些只能用声明的语法应用在装配的级别,而不是应用给方法或者是类。最棒的是管理员可以在装配之后查看请求的permissions,使用permview.exe你可以查看它所被赋予的permissions

RequestMinimum

你可以使用requestMinimum去指定permissions。代码只允许在所有permissions都被赋予的时候才能够跑。在下面的代码片段中,有一个请求去写注册表的请求。如果这个没有被安全机制赋予权限,这个装配甚至不会被装载。就像之前提到的,这种请求能够在装载的时候完成。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->using System;
using System.Windows.Forms;
using System.IO;

using System.Security;
using System.Security.Permissions;

// placed in assembly level
// using declarative syntax
[assembly:RegistryPermission(SecurityAction.RequestMinimum, 
         Write
="HKEY_LOCAL_MACHINE\\Software")]

namespace SecurityApp
{
    
// Rest of the implementation
}

RequestOptional

使用RequestOptional,你能指定你的代码所需要的permissions,而不是跑的时候才请求。如果你的代码没有被赋予optional permissions,你必须处理代码片段在执行时需要optional permissions而抛出的异常。这里有一些在使用requestOptional时必须注意的事情

如果你使用RequestOptionalRequestMinimum,除了他们两再没有其他的permissions将被赋予,如果被安全机制所允许。尽管安全机制允许添加permissions到你的装配集,他们将不会被赋予。看下面的代码片段:

[assembly:FileIOPermission(SecurityAction.RequestMinimum, Read="C:\\")]

[assembly:FileIOPermission(SecurityAction.RequestOptional, Write="C:\\")]

这个装配集的permissions只是对文件系统的读和写。是否还需要显示UI?然后这个装配集被装载,但是一个异常被抛出,当显示UI的代码被执行的时候,因为尽管安全机制允许UIPermission,但是它没有被装配集允许。

RequestRefuse

你可以使用RequestRefuse去指定你确定不需要被赋予的permissions在你的代码中,即使他们已经被安全机制赋予了,然后拒绝写的permission将保证你的代码不会被滥用

[assembly:FileIOPermission(SecurityAction.RequestRefuse, Write="C:\\")]






分享到:
评论

相关推荐

    DOTNET安全编程下载

    本书在后续章节中系统介绍了.NET安全的功能,其中包括运行库支持、证据、代码标识、权限、代码访问安全性(CAS)、基于角色的安全性等。在介绍了ASP.NET和COM+组件服务的章节之后,本书还特意留出了一部分章节来介绍...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java版商城源码下载-jeesite_refactor:重构jeesite以集成CAS等

    JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台。 JeeSite是您快速完成项目的最佳基础平台解决方案,JeeSite是您想学习Java平台的最佳学习案例,JeeSite还是...

    Java并发之无锁.docx

    在两种派别对应在并发中就是加锁和无锁,也就是说加锁是一种悲观的策略,而无锁是一种乐观的策略。对于锁,如果有多个线程同事访问一个临界资源,宁可...这里无锁策略使用了一种称为CAS的技术来保证线程执行的安全性。

    Java Unsafe类的使用.docx

    CAS算法的出现使得在不使用synchronize这种“悲观锁”依然可以实现数据的安全访问,CAS算法是指先读取要修改的变量值,对它进行计算,然后执行检查并更新这个步骤(更新前判断那个值是否是之前那个读到的值),检查...

    基于 springboot、ant-design-vue 的开源框架+源代码+文档说明

    使用Maven做项目管理,提高项目的易开发性、扩展性。 目前功能模块代码生成器、权限框架、数据字典、数据缓存、数据监控、计划任务、多数据源管理、类似mybatis动态SQL、短信发送、邮件发送、统计功能等功能。 ##...

    单点登录技术文档 多用户多系统多数据库

    4. 增加了安全性:系统管理员有了更好的方法管理用户,包括可以通过直接禁止和删除用户来取消该用户对所有系统资源的访问权限 对于内部有多种应用系统的企业来说,单点登录的效果是十分明显的。很多国际上的企业...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    spring security 参考手册中文版

    使用protect-pointcut添加安全性切入点 66 6.5默认AccessDecisionManager 67 6.5.1自定义AccessDecisionManager 67 6.6验证管理器和命名空间 67 7.示例应用程序 69 7.1教程示例 69 7.2联系人 69 7.3 LDAP样本 71 7.4...

    spring in action英文版

    第一部分 Spring基础  第1章 开始Spring之旅 ... 11.4.5 确保通道安全性  11.4.6 使用Acegi的标签库  11.5 保护方法调用  11.5.1 创建一个安全切面  11.5.2 使用元数据保护方法  11.6 小结

    jeesite后台框架

    支持多数据源,简单properties配置即可实现,为了安全性吧,暂不提供界面维护数据源,不存数据库。 数据表主键优化,如分类科目表,采用有意义的主键方式,让客户去自定义,减少后期运维维护成本。 实体@Table注解...

    java开源包8

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包10

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    基于jbpm与activiti的工作流平台技术架构介绍

    基础组件包括: Spring基础组件库,报表引擎,数据库访问模块,短信模块,后台定时任务调用组件,短信访问组件,搜索引擎组件,JMS消息组件,Activiti工作流组件,Cas统一用户认证组件,Spring安全认证组件。...

    georchestra:这是主要的geOrchestra Spatial Data Infrastructure存储库,托管源代码-docker source code

    它是一个基于代理/ CAS / LDAP元数据目录(地理网),一个OGC服务器(GeoServer的)细粒度访问控制(基于地理栅栏),先进的浏览和编辑,提取,还有更多(安全性和身份验证系统,分析,管理用户界面...) ...

    UCR MFA Helper-crx插件

    用于自动填充UCR MFA代码的Chrome扩展,以简化您在自己的计算机上访问UCR站点的方式。 这是一个开源调整。 https://github.com/mingjun97/ucr_mfa_crx. 用法: 单击扩展名(通常在右上角),输入NetID和密码。 ...

    java开源包1

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包11

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包2

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

Global site tag (gtag.js) - Google Analytics