如何将.net程序集标记为安全?

时间:2012-01-09 21:33:26

标签: c# assemblies

如何将装配标记为“安全”?

或者,我如何让Visual Studio告诉我何时装配中的某些内容不“安全”?


有时你不能使用装配,除非它是“安全的”(例如from SQL Server)。

我希望我的装配被标记为安全。如果我的装配不能被标记为安全,因为它不安全,我想知道我怎么知道我的装配是不安全的。


Visual Studio中有一些概念似乎与安全性有关,可能与组件“安全”有关,也可能没有任何关系:

  1. 允许不安全的代码汇编选项:

    enter image description here

    • 如果我检查允许不安全代码选项,该怎么办?
    • 如果我取消选中允许不安全代码选项,该怎么办?
    • “不安全代码”与“安全”程序集有什么关系(如果有的话)?

      (我问因为我的程序集不“允许不安全的代码”,但允许P / Invoke调用 - 我认为这是“不安全”的定义)

  2. ClsCompliant 汇编选项:

    [assembly: CLSCompliant(true)]
    namespace MyApplication
    
    • “cls compliance”代码与“安全”的程序集有什么关系(如果有的话)?
  3. 不安全代码块:

    int error;
    unsafe
    {
        error = 0x80004005;
    }    
    

    unsafe块内的代码是“不安全”

  4. UnsafeNativeMathods

    Microsoft建议创建一个名为UnsafeNativeMethods的类,其中包含不安全的托管代码:

    [SuppressUnmanagedCodeSecurity]
    internal static class UnsafeNativeMethods
    {
       ...          
    }
    

    这与SafeNativeMethods

    形成鲜明对比
    [SuppressUnmanagedCodeSecurity]
    internal static class SafeNativeMethods
    {
       ...          
    }
    

    包含安全的原生方法,NativeMethods

    internal static class SafeNativeMethods
    {
       ...          
    }
    

    包含原生方法。

  5. 如何将装配标记为“安全”?

    SQL如何知道汇编“不安全”?

4 个答案:

答案 0 :(得分:26)

  

如何将装配标记为"安全"?

你正在以错误的方式思考这个问题。

你认为可能想杀死你的人会给你一个瓶子然后说#34;喝这个"。你说"喝酒是否安全?"那家伙说"读瓶子"。你做。它说"安全饮用"在上面。

你喝了吗?

液体是否可以安全饮用与瓶子上的标签所说的无关!将汽油放入标有“安全饮用”的瓶子中是完全可能的。

你是那个把装满可疑液体的瓶子分发给SQL服务器的人,SQL Server说"我不相信你的任何标签。重新开始这个组装"。相反,它将使组装安全"通过限制程序集可以执行的操作。它会锁定对该事物的权限,以便程序集利用SQL服务器的任何尝试都将导致它通过异常终止。

  

我怎么知道我的装配中的某些东西不是"安全"?

尝试以低信任度运行它。它是否因安全异常而崩溃并死亡?如果答案是肯定的,那么根据该信任级别,它不是安全的。不同的信任级别授予不同级别的权限。您在自己的计算机上安装的代码通常完全受信任,您从公司网络运行的代码不太受信任,您从互联网运行的代码根本不受信任。您在SQL Server中运行的代码对所有人的信任程度最低;它认为几乎所有事情都是不安全的。

  

如果我检查允许不安全代码选项,该怎么办?

然后,您可以编写直接以其选择的方式操作原始指针到内存的代码。这需要完全信任;如果您希望使用不安全的代码,则必须对程序集设置 no 限制。不安全的代码可以在此过程中改变用户模式内存的每一位。

  

如果有任何关系," cls是否合规"代码与安装"?

的程序集有关

无论如何,除了符合CLS的代码不允许采用原始指针类型的API这一事实。

CLS是公共语言子集 - 所有兼容的.NET语言中必须存在的一组功能。这样你就不必问问自己了,嘿,如​​果我写这个带有int的方法并在C#中返回一个字符串,我可以用F#调用吗?"如果您限制自己遵循CLS的规则,那么您就知道任何CLS语言都可以使用您的库,并且您可以使用符合CLS的库,无论它们使用何种语言编写。它与安全性无关。 / p>

  

不安全区块内的代码是"不安全"

如果写入错误,不安全块内的代码可能会在整个过程中任意破坏内存。我们会让你标记这样的代码"不安全"以便您知道在哪里集中代码审查工作。在不安全的块中,而不是 C#语言,负责确保类型和内存安全。

你没问过的问题:

  

将程序集标记为"对于部分受信任的调用者来说是安全的"意思?

这是 将程序集标记为" safe"的情况。通过使用AllowPartiallyTrustedCallerAttribute(APTCA)标记程序集,程序集的作者,断言如果程序集中的代码被试图攻击用户的低信任恶意代码调用,那么程序集中没有任何内容低信任恶意代码可以用来对付用户。简而言之,即使用户完全信任,你也说'#34;我的代码不是邪恶代码可以对用户使用的武器"。

我们发明了APTCA,因为在当天,Peter Torr和我发现有一种方式可以让那些信任度低的恶意调用者欺骗JScript.NET代码 - 默认情况下是高度信任 - 以这种方式低信任代码可能导致JScript.NET代码代表它攻击用户。 (这通常被称为"引诱攻击"因为低信任代码"引诱"高信任代码为它做脏工作。)

作为确保此类错误不再发生的大量努力的一小部分,CLR团队引入了APTCA。通过将APTCA放在程序集上,您告诉您的用户您声称他们对您的工作的信任不会被恶意的第三方代码滥用。不要将APTCA放在程序集上,除非(1)您打算以便用户认为可能具有敌意的代码调用程序集,并且(2)您实际上已经进行了彻底的安全审查。

幸运的是,新的基于透明度的安全模型消除了对APTCA的大部分需求。

如果组件中没有APTCA,则链接需求"将确保调用您的程序集的代码完全受信任。请注意,它是链接需求,而不是完整需求

答案 1 :(得分:12)

  • this读取,SQL Server的“安全”是:
  

SAFE是限制性最强的权限集。        具有SAFE权限的程序集执行的代码无法访问        外部系统资源,如文件,网络,环境        变量或注册表

所以它在SQL Server代码域

中设置了代码执行权限
    来自VS的
  • Unsafe标志无关,基本上是代码执行安全性,但启用非托管代码执行。所以这是关于非托管代码集成到托管代码库

  • 定义here
  • CLS Compilant属性是关于定义标有该属性的程序集的代码,就像遵循CSL(公共语言规范)指南的代码一样。所以关于编译和代码架构

  

如何将装配标记为“安全”?

它在此答案的第一个链接中定义,并与SQL Server集成有关。

  

SQL如何知道汇编“不安全”?

考虑提供的描述:“创建一个托管应用程序模块,其中包含类元数据和托管代码作为SQL Server实例中的对象”,SQL Server在metadata上进行中继,在某些字段中提供有关事实上,如果它是“安全的”。

答案 2 :(得分:2)

在这种情况下,SQL正在查找包含在“不安全”块中的代码。这是指向unsafe关键字的MSDN指针

http://msdn.microsoft.com/en-us/library/chfa2zb8.aspx

答案 3 :(得分:0)

取决于你的意思,但如果你导入一个程序集(即.dll),那个.dll文件的属性中就会有一个“unblock”选项。这将允许您使用dll作为参考。