Safe Haskell的安全性如何?

时间:2014-11-06 13:23:28

标签: haskell sandbox

我在想Safe Haskell,我想知道我有多信任它?


一些虚构的场景:

  1. 我是一个编写可编程游戏的小黑客(想想Robocode),我允许其他人为自己的实体编程以相互竞争。大多数情况下,用户将在私人计算机上运行一些不受信任的程序。在运行之前可能会检查不受信任的代码。

  2. 我是多个客户使用的应用程序的程序员。我提供了一个API,以便他们可以扩展功能并鼓励我的用户分享他们的插件。用户社区规模很小,大部分时间都存在相互信任,但偶尔有人正在开展一项绝密的客户项目,任何数据泄漏都将是灾难性的。

  3. 我是...谷歌(或Facebook,雅虎等),并希望允许我的客户脚本他们的电子邮件帐户。脚本已上载并在我的服务器上运行。任何访问违规都是致命的。


  4. 鉴于以下情况:

    • Safe Haskell 是否适合确保沙盒和访问限制?
    • 在特定情况下,某人是否应该相信所作出的承诺?

2 个答案:

答案 0 :(得分:8)

根据经验,我说安全的Haskell试图大致得到C#安全子集的位置。对于您的场景:

  1. 可以使用安全的haskell,因为您正在检查代码。
  2. 不能单独使用安全的haskell来避免灾难性的数据泄漏。
  3. 我不建议Google或雅虎依靠安全的haskell来运行不受信任的代码。首先,它不会管理过多的资源消耗(CPU,内存,磁盘)或底部(未定义或真实)。使用操作系统沙箱。
  4. 关于未定义的注释:在操作上,它通过抛出异常来停止函数返回值,错误函数也是如此。从表面上看,它被认为是“底层”。值。现在,即使安全的Haskell不允许未定义和错误,函数仍然无法返回,只需循环无休止。无尽的循环也是最底层的。如此安全的Haskell保证了类型和内存的安全性,但并不试图保证函数终止。当然,安全Haskell是图灵完整的,因此一般不可能证明终止。此外,由于内存不足会引发异常,因此函数可能会终止。最后,模式匹配错误抛出异常。所以安全的Haskell不能消除任何类型的底部,也可能允许显式的未定义和错误。

答案 1 :(得分:-6)

据我所知,安全的Haskell并不安全。有人可以在包中使用unsafePerformIO并手动覆盖“不安全”因素。如果不是,那么对c程序或系统库有任何依赖性的每个包都不能被标记为安全。 (想想libgmp.so,它几​​乎与每个人的Haskell基础包相关联。对于要被标记为安全的基础包,即使它使用unsafePerformIO,也必须以某种方式明确标记为安全。 / p>