查看西纳特拉的路线

时间:2015-04-04 20:34:28

标签: ruby sinatra

以下代码片段是我在Sinatra应用程序中处理路由的方式。我的所有视图都包含在我的views / pages目录中。这些只是代表静态html的haml文件,带有一些javascript。以这种方式加载视图是否有任何负面影响?如果页面不存在,则会抛出找不到文件的错误。我担心这是某种攻击媒介。

 error RuntimeError do
    status 500
    "A RuntimeError occured"
  end

  get '/:page' do
    begin
      haml "pages/#{params['page']}".to_sym
    rescue Errno::ENOENT
      status 404
      "404"
    end
  end

2 个答案:

答案 0 :(得分:1)

我不确定这是否是一个安全问题(我不是在Sinatra的所有细节中)但在使用用户指定的数据时,例如params['page'],我倾向于偏执。如上所述,我不确定Sinatra是否对内容进行了清理并使这个例子变得不可能,但想象它会说../db_connection.yml之类的内容。因此,Sinatra将被告知加载可能实际存在的haml文件pages/../db_connection.yml并将其显示给用户,向他们显示数据库配置。

如果你的pages目录中没有任何奇怪的符号链接,那么用一个像.gsub(/\.+/, ".")传递的字符串替换点的所有双重出现就足够了(或者替换所有点如果你不需要它们在名称中更加偏执)。我不确定是否有任何多字节的不安全因素,有人可以用编码做一些丑陋的事情,而且完全替换它可能毫无用处,因为该漏洞利用仍然有效。

编辑:简短阅读Sinatra手册即可获得

  

顺便说一下,除非你禁用路径遍历攻击保护(见下文),否则在修改路由之前可能会修改请求路径。

因此,如果只使用params值而不进行任何特殊过滤应该是安全的,那么您可能会更多地查看文档(尤其是安全性部分)。但是,如果可以确定pages目录中的文件是否存在,我认为这不是太大的安全问题。

答案 1 :(得分:0)

  

以这种方式加载视图是否有任何负面影响?

时间是一,生成页面需要花费更长的时间而不是静态页面。出于同样的原因,资源使用将是另一个。增加了复杂性。重新发明轮子将是另一个。

为什么不只是put static pages in the public directory?或者为什么不使用static site generator?

选择适合您需求的工具,不要重新发明轮子(特别是当框架已经为您提供了这个轮子时!)