你怎么能强迫推特';s Scala Eval以防止注入代码?我想将Eval限制为指定配置参数

你怎么能强迫推特';s Scala Eval以防止注入代码?我想将Eval限制为指定配置参数,scala,twitter,eval,Scala,Twitter,Eval,我喜欢将“代码作为数据”用于配置的想法,因为您从案例类获得的验证与您希望用于配置文件的验证相同。Twitter编写了一个很好的Eval实用程序,使这变得很容易()。我希望允许用户将配置文件上载到远程服务。这就有可能针对我的远程服务注入代码 例如,如果我有以下配置案例类: case class MyConfig(param1: String) 我希望用户能够上载包含以下命令的文件: MyConfig(param1 = "My Param Value") MyConfig(param1 = {i

我喜欢将“代码作为数据”用于配置的想法,因为您从案例类获得的验证与您希望用于配置文件的验证相同。Twitter编写了一个很好的Eval实用程序,使这变得很容易()。我希望允许用户将配置文件上载到远程服务。这就有可能针对我的远程服务注入代码

例如,如果我有以下配置案例类:

case class MyConfig(param1: String)
我希望用户能够上载包含以下命令的文件:

MyConfig(param1 = "My Param Value")
MyConfig(param1 = {import someDangerousPackage; someDangerousCommand(); "My Param Value"})
…但不是包含以下命令的文件:

MyConfig(param1 = "My Param Value")
MyConfig(param1 = {import someDangerousPackage; someDangerousCommand(); "My Param Value"})

有没有办法拦截编译以确保没有调用任何函数?

人们可以添加危险代码而无需导入包;需要多少行代码才能发出rm。。。指挥部


最好的解决方案是不让人们发送代码进行配置;只需使用XML解析器之类的工具。唯一真正安全的替代方法是自己解析上传,并将其与允许使用的严格的关键字白名单(和带引号的字符串)进行比较。到目前为止,您编写自己的解释器已经走了一半,而且仍然容易出错,因此解析文本文件开始看起来像是一种懒惰的选择,也是一种安全的选择。

如果您已经有了case类,为什么不直接使用typesafe配置文件并从中提取它呢?看看我认为它们提供了一些基本的安全选项如果我使用typesafe配置文件创建并验证一个案例类实例,那么我的行号将反映生成的案例类,不是最初的HOCON——除非我误解了方法……我更改了我的注入示例以包含导入,因为我可能(希望)通过阻止类装入器导入包来解决这个问题……也许……谢谢,Josiah。我最终放弃了TwitterEval,转而使用Scala解析器组合器定制DSL。一旦你理解了语法,它实际上比解析XML更容易。@ToddLanders请结束这个问题