Tod*_*ers 5 twitter scala eval
我喜欢配置"代码作为数据"的想法,因为从案例类获得的验证与配置文件所需的验证相同.Twitter写了一个很好的Eval实用程序,使这很容易(https://github.com/twitter/util).我想允许用户将配置文件上传到远程服务.这开辟了为我的远程服务注入代码的潜力.
例如,如果我有以下配置案例类:
case class MyConfig(param1: String)
Run Code Online (Sandbox Code Playgroud)
我希望用户能够上传包含命令的文件:
MyConfig(param1 = "My Param Value")
Run Code Online (Sandbox Code Playgroud)
...但不是包含命令的文件:
MyConfig(param1 = {import someDangerousPackage; someDangerousCommand(); "My Param Value"})
Run Code Online (Sandbox Code Playgroud)
有没有办法拦截编译,以确保没有调用任何函数?
人们可以在不导入包的情况下添加危险代码;发出 rm ... 命令需要多少行代码?
最好的解决办法是不要让人发代码进行配置;只需使用 XML 解析器或类似的工具即可。唯一真正安全的替代方案是自己解析上传内容并将其与允许使用的关键字(和带引号的字符串)的严格白名单进行比较。至此,您已经完成了编写自己的解释器的一半工作,并且仍然容易犯很多错误,因此解析文本文件开始看起来既是一种懒惰的选择,也是一种安全的选择。