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

2024-01-01

如何将程序集标记为“安全”?

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


有时,除非程序集“安全”,否则您不能使用它(例如从 SQL Server https://stackoverflow.com/questions/1646980/why-wont-sql-server-register-my-assembly-as-safe).

我希望我的程序集被标记为安全。如果我的程序集因为不安全而无法标记为安全,我想知道如何知道我的程序集不安全。


Visual Studio 中的一些概念似乎与安全性相关,它们可能与程序集的“安全”有任何关系,也可能没有关系:

  1. 允许不安全代码装配选项:

    • 如果我检查允许什么允许不安全代码 option?
    • 如果我取消选中,哪些是不允许的允许不安全代码 option?
    • “不安全代码”与程序集“安全”有什么关系(如果有)?

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

  2. 符合Cls标准 http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx装配选项:

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

    int error;
    unsafe
    {
        error = 0x80004005;
    }    
    

    里面的代码unsafe块是“不安全的”

  4. 不安全的本机方法 http://msdn.microsoft.com/en-us/library/ms182161.aspx

    微软建议创建一个名为UnsafeNativeMethods包含不安全的托管代码:

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

    这与SafeNativeMethods:

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

    包含安全的本机方法,以及NativeMethods:

    internal static class SafeNativeMethods
    {
       ...          
    }
    

    包含本机方法。

如何将程序集标记为“安全”?

SQL 如何知道 as 程序集“不安全”?


如何将程序集标记为“安全”?

你思考这个问题的方式是错误的。

你认为可能想杀你的人递给你一个瓶子并说“喝这个”。你说“喝安全吗?”那家伙说“读一下瓶子”。你做。上面写着“安全饮用”。

你喝吗?

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

你就是那个把装满可疑液体的瓶子交给 SQL 服务器的人,并且 SQL Server 说“我不信任您要在此程序集上添加的任何标签”。相反,它将通过限制程序集可以执行的操作来使程序集“安全”。它锁定该事物的权限,以便程序集利用 SQL Server 的任何尝试都将导致其通过异常终止。

我如何知道程序集中的某些内容不“安全”?

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

如果我选中允许不安全代码选项,可以执行什么操作?

然后,您可以编写代码,以自己选择的方式直接操作指向内存的原始指针。这需要充分的信任;必须有no如果您希望使用不安全的代码,则对您的程序集施加限制。不安全代码可以更改进程中用户模式内存的每一位。

“cls 兼容”代码与程序集“安全”有什么关系(如果有的话)?

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

CLS 是公共语言子集——所有兼容的 .NET 语言中都需要存在的一组功能。这样您就不必问自己“嘿,如果我在 C# 中编写这个接受 int 并返回字符串的方法,我可以从 F# 中调用它吗?”如果您限制自己遵守 CLS 规则,那么您就知道任何 CLS 语言都可以使用您的库,并且您可以使用符合 CLS 的库,无论它们是用什么语言编写的。它与安全性没有任何关系。

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

如果写得不好,不安全块内的代码可能会在整个过程中任意破坏内存。我们让您将代码标记为“不安全”,以便您知道将代码审查工作集中在哪里。在不安全的区块中you, not C# 语言,负责确保类型和内存安全。

一个你没有问过的问题:

将程序集标记为“对于部分受信任的调用者来说是安全的”意味着什么?

在这种情况下,您do将程序集标记为“安全”。通过使用AllowPartiallyTrustedCallerAttribute (APTCA) 标记程序集,您(程序集的作者)断言,如果程序集中的代码由试图攻击用户的低信任恶意代码调用,则程序集中没有任何内容低信任度的敌对代码可以使用它来攻击用户。简而言之,您是在说“即使用户完全信任,我的代码也不是邪恶代码可以用来对付用户的武器”。

我们发明了 APTCA,因为当时 Peter Torr 和我发现,对于信任度较低的恶意调用者来说,有一种方法可以欺骗 JScript.NET 代码(默认情况下信任度很高),以这样的方式,信任代码可能会导致 JScript.NET 代码代表其攻击用户。 (这通常称为“引诱攻击”,因为低信任代码“引诱”高信任代码为其完成肮脏的工作。)

作为确保此类错误不再发生的巨大努力的一小部分,CLR 团队引入了 APTCA。通过将 APTCA 放在程序集中,您就告诉用户您正在声明他们对您的工作的信任不会被敌对的第三方代码滥用。请勿将 APTCA 放在组件上,除非 (1)intend对于用户认为可能有敌意的代码调用的程序集,以及 (2) 您实际上已经进行了彻底的安全审查。

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

如果程序集中不存在 APTCA,则“链接需求”将确保调用程序集的代码是完全可信的。请注意,它是一个链接需求, not a 满需求.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 .net 程序集标记为安全? 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 如何在AWS EMR上重新启动yarn

    我正在使用 Hadoop 2 6 0 emr 4 2 0图像 我做了一些改变yarn site xml并希望重新启动纱线以使更改生效 有一个命令可以用来执行此操作吗 编辑 2017 年 10 月 26 日 AWS 官方已在此处发布了有关如何
  • Angular 5(Karma / Jasmine 测试)- 使用模拟后端来模拟错误消息的错误响应

    我不太明白 MockBackend 功能是如何工作的描述在这里 https angular io api http testing MockBackend 我对 Angular 完全陌生 我想编写一些测试用例 以确保当后端发生服务器错误时
  • 用于平铺渲染的 OpenGL 矩阵设置

    看完之后datenwolf 2011 年关于 OpenGL 中基于图块的渲染设置的回答 https stackoverflow com questions 6490728 capture snapshot of opengl window
  • 使用 Monkey Test 时如何防止输入设置

    我在 Android 设备 LG G4 中对我的应用程序进行了猴子测试 命令是 adb shell monkey p package name v 2000 但它可能会意外进入设置并更改我的设备的默认值 如何预防呢 Monkey支持黑名单
  • 使用 KVO 更改属性时发送通知

    我有一个名为myName在我的课堂上 比如 property nonatomic strong NSString myName 我需要在以下情况时发送通知myName属性的值发生改变 现在我正在做类似的事情 void setMyName N
  • 如何在设计时进行调试?

    我使用 UserControl 创建了一个自定义 ListView 当鼠标进入 ColumnHeader 时 它应该在设计时改变颜色 它有效 但我需要调试代码 如何在设计时调试代码 See 演练 在设计时调试自定义 Windows 窗体控件
  • 可以删除Android依赖吗?

    我有一个应用程序 到目前为止一直工作和编译得很好 但是 当我转到 导出 时 会自动添加 Android 依赖项 这会引发 转换为 Dalvik 格式失败 错误 1 我对此进行了研究 我知道这是因为 Android 依赖项添加了重复文件 我目
  • 加入具有不同排序规则问题的列

    我正在使用 SQL Server 2005 我有两个表 它们使用不同的排序规则 不允许连接具有不同排序规则的表中的列 例如不允许使用以下 SQL select table1column1 table2column2 from 我的问题是 为
  • C++/SDL2——渲染一个圆[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我用 SDL2 画一个实心圆 方向正确吗 我认为使用参数方程和趋于零的半径是可行的 但在处理器使用方面似乎效率很低 任何其他想法都非常感谢 提前
  • 如何从 Ruby on Rails 应用程序中的 OAuth::Unauthorized 异常中拯救出来?

    如何挽救 Ruby on Rails 应用程序中 OmniAuth 引发的 OAuth Unauthorized 异常 显然是这样的 rescue from OAuth Unauthorized with gt unauthorized 不
  • java nio 直接缓冲区上的压缩

    gzip 输入 输出流不在 Java 直接缓冲区上运行 是否有直接在直接缓冲区上运行的压缩算法实现 这样就不会产生将直接缓冲区复制到 java 字节数组进行压缩的开销 我无意转移你的问题 但这就是really你的程序中有一个好的优化点吗 您
  • 在 C# 中获取属性值(反射)的最快方法

    我想知道从对象的属性获取值 仅针对此问题 的最快方法是什么 经过一番搜索后 我在这个网站上看到了 MarkGravell 的帖子 他写了这段代码 using System using System Reflection using Syst
  • new Integer(123)、Integer.valueOf(123) 和 just 123 之间的区别

    最近我看到这样的代码 Java myMethod new Integer 123 我目前正在重构一些代码 声纳工具中有一个提示 使用这样的东西对内存更友好 myMethod Integer valueOf 123 但是在这种情况下 我认为使
  • 来自主线程的 VTK 窗口线程,C++

    我刚刚学习 VTK 和 C GUI 编程 希望有一个简单的问题 主应用程序在应用程序中的某个时刻启动渲染的窗口 希望在显示 VTK 窗口时主线程能够继续 是否有特定的方法可以将 VTK 窗口作为线程启动 我的环境是 Linux 可以使用 b
  • IFNDR 是否优先于可诊断的违规行为?

    简介 合规性 一般 2 https timsong cpp github io cppwp n4868 intro compliance general 2指定编译器应如何处理给定的程序 特别是它有两点涉及格式错误的程序 2 2 要求编译器
  • Numpy 重新索引前 N 个自然数

    我有一个索引非常稀疏的矩阵 行和列中的最大值都超过 130000 但其中只有少数行 列实际上具有非零值 因此 我希望通过前 N 个自然数将行索引和列索引移动为仅表示非零索引 从视觉上看 我想要一个像这样的示例矩阵 1 0 1 0 0 0 0
  • 在circos中使用circos函数

    有人能帮我吗 如何在数据中添加 circos 函数 当我尝试时 我收到一条错误消息 但它不会产生任何结果 我想做一个像 1 号表示一样的甜甜圈图形 但我还有另一个结果 我们可以在另一张图片中看到 试图跟随本指南 https jokergoo
  • JNI4Net C# 到 Java

    我有一个简单的 Java 类 名为jniBridge Calculator有一种简单的方法Add int a int b 使用 eclipse 构建项目后 我将项目导出为 JAR 文件 然后我在 JAR 文件上调用 proxygen 这会生
  • Ruby 的 File.open 给出“没有这样的文件或目录 - text.txt (Errno::ENOENT)”错误

    我在我的 Win 7 机器上安装了 Ruby 1 9 2 创建了一个简单的analyzer rb文件 它有这一行 File open text txt each line puts line 当我运行代码时 它给我这个错误 analyzer
  • 如何将 .net 程序集标记为安全?

    如何将程序集标记为 安全 或者 当程序集中的某些内容不 安全 时 我如何让 Visual Studio 告诉我 有时 除非程序集 安全 否则您不能使用它 例如从 SQL Server https stackoverflow com ques