Safe Haskell的安全性如何?

fho*_*fho 17 haskell sandbox

我在考虑安全Haskell,我想知道我有多信任它?


一些虚构的场景:

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

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

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


鉴于这些情况:

  • 安全哈斯克尔是适当的,以确保沙盒和访问限制?
  • 在特定情况下,某人是否应该相信所作出的承诺?

Gar*_*thR 8

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

  1. 可以使用安全的haskell,因为你正在检查代码.
  2. 不能单独使用安全的haskell来避免灾难性的数据泄漏.
  3. 我不建议谷歌或雅虎依靠安全的haskell单独运行不受信任的代码.首先,它不管理过多的资源消耗(CPU,内存,磁盘)或底部(未定义或真实).使用操作系统沙箱.

关于undefined的注释:在操作上,它通过抛出异常来停止函数返回值,错误函数也是如此.从表面上看,它被认为是"底层"价值.现在,即使安全的Haskell不允许未定义和错误,函数仍然无法返回,只需循环无休止.无尽的循环也是最底层的.所以安全的Haskell保证了类型和内存的安全性,但并不试图保证函数终止.当然,安全Haskell是图灵完成的,因此通常不可能证明终止.此外,由于内存不足会引发异常,因此函数可能会终止.最后,模式匹配错误抛出异常.如此安全的Haskell无法消除任何类型的底部,也可能允许显式的未定义和错误.

  • @Florian Safe Haskell更多的是阻止人们从类型系统的角度使用不安全的函数,而不是从"沙盒"的角度来看.如果你想要,你应该写一个你可以解释的dsl.考虑一下免费monad,它们非常适合为此目的构建dsls. (6认同)