【问题标题】:Changing a readonly string field更改只读字符串字段
【发布时间】:2016-12-09 04:17:51
【问题描述】:

为什么我可以这样做?是bug吗?

Debug.WriteLine (System.Boolean.FalseString); // output: "False"

fixed (char* xx = System.Boolean.FalseString) {
    xx[1] = 'X';
}

Debug.WriteLine (System.Boolean.FalseString); // output: "FXlse"

然后,FalseString 具有新值。

我不知道是否是一个错误,因为FalseString 是一个只读字段。

是否存在安全问题?

托管模型真的不安全吗?

我可以从附属库中进行更改,这会导致主进程崩溃吗?

【问题讨论】:

  • 关键字被称为“不安全”是有原因的
  • 这有什么让你困惑的?您正在进入内存并以一种不关心只读性的方式对其进行修改。
  • 我并不困惑。我知道我正在使用指针访问内存。在我看来,这似乎是一个设计错误和框架的概念。我只是认为 readonly 是在内存的受保护或只读(受控)部分中创建的。实际上,“不安全”这个词被放在了不安全的代码中,这是令人困惑的。 Readonly 应该是 readonly 并且 unsafe 应该释放我自己的数据并且不允许我修改未标记为“不安全”的代码数据
  • 你认为记忆是如何工作的?你怎么会不能指向某些东西并改变它?你认为它是一个类似储物柜的系统,你可以在里面关闭它,只有你有钥匙才能打开它?
  • 或多或少...有由处理器控制的只读内存页...

标签: c# string fixed readonly unsafe


【解决方案1】:

正如 Brandon Ibbotson 和 Dispersia 已经提到的,这不被视为安全漏洞,因为 "It rather involved being on the other side of this airtight hatchway: ..." 原则,Raymond Chen 在他的许多 blog 帖子中幽默地阐述了其他人提出的类似问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2013-08-06
    相关资源
    最近更新 更多