Rails应用程序中的沙盒JS执行

时间:2016-12-22 15:10:52

标签: javascript ruby-on-rails ruby security sandbox

背景

我正在构建一个Ruby on Rails应用程序,允许用户上传将在服务器上执行的自定义JavaScript。此自定义脚本用于在API响应上定义字段。以下列表描述了事件的顺序。

  1. 用户通过POST
  2. 向应用程序API发送HTTPS请求
  3. API控制器制定JSON响应
  4. 执行用户脚本,输出将保存为JSON响应中的字段
  5. 发送API响应
  6. 以下方法用于脚本执行。 script_body包含用户的自定义JavaScript,并作为属于用户的对象的文本字段保存在DB中。

    def run_script
      begin
        Timeout::timeout(2) { script_output = ExecJS.exec(script_body).to_s }
      rescue => e
        logger.info  "Script failed: #{e.message}"
        script_output = "(Script failed with the following error: #{e})"
      end
    end
    

    问题

    我想知道如何最好地沙箱执行JS脚本以减轻在服务器上执行用户脚本的安全隐患。我想知道推荐的方法:

    • 确保JS脚本无法访问服务器上的任何文件
    • 阻止脚本访问Rails应用程序或数据库
    • 防止任何其他恶意活动(我不是专家所以请原谅缺乏细节)
    • 保持合理的性能(需要在API调用中执行)

    其他信息

    我试图在Ruby应用程序中找到一些沙箱JS执行的例子,并且找不到多少。我查看了以下gem(https://github.com/tario/shikashi)。但是,这似乎只是Ruby代码的沙箱。我担心我会为ExecJS.exec提供执行权限,然后JS就可以做任何想做的事情。我不确定这是最好的方法。

1 个答案:

答案 0 :(得分:0)

也许你可以使用ruby`s $SAFE levels