现在的位置: 首页 > 综合 > 正文

.NET(C#):短命的SecurityTreatAsSafe特性

2012年11月23日 ⁄ 综合 ⁄ 共 1322字 ⁄ 字号 评论关闭

.NET 2.0中引入了1级透明度模型(但是仅在程序集内被强制),透明代码是不可以访问关键代码的,即使是在同一个程序集内(或是在同一个类型里),如下代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Security;

using System.Security.Permissions;

 

//使用透明度模型级别1

[assembly: SecurityRules(SecurityRuleSet.Level1)]

[assembly: SecurityCritical]

 

namespace Mgen

{

    class Program

    {

        //透明

        static void Main(string[] args)

        {

            doo();

        }

 

        //关键

        [SecurityCritical, SecurityTreatAsSafe]

        static void doo()

        { }

    }

}

 

此代码会抛出异常:

Unhandled Exception: System.MethodAccessException: Attempt by security transpare

nt method 'Mgen.Program.Main(System.String[])' to access security critical metho

d 'Mgen.Program.doo()' failed.

 

显然透明代码是不能直接访问关键代码的。

在透明度模型级别1,可以使用SecurityTreatAsSafe特性标记在方法上,就可以正常访问了:

[SecurityCritical, SecurityTreatAsSafe]

static void doo()

{ }

不过在.NET 4.0后引入了透明度模型级别2,安全模型发生了许多变化,SecurityTreatAsSafe也被废弃,取而代之的是SecuritySafeCritical特性,直接标记目标为“可靠安全代码”。

 

在.NET 4.0上述代码完整应该是:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Security;

using System.Security.Permissions;

 

//.NET 4.0默认使用透明度模型级别2

[assembly: AllowPartiallyTrustedCallers]

 

namespace Mgen

{

    class Program

    {

        //透明

        static void Main(string[] args)

        {

            doo();

        }

 

        //可靠关键

        [SecuritySafeCritical]

        static void doo()

        { }

    }

}

 

Open-mouthed smile

抱歉!评论已关闭.