在 Sinatra 中查看路线

View routes in 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

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

如果您的 pages 目录中没有任何奇怪的符号链接,那么用传递的字符串的 .gsub(/\.+/, ".") 之类的东西替换所有重复出现的点可能就足够了(或替换如果您不需要名称中的所有点,则它们会更加偏执)。我不确定是否存在任何多字节不安全因素,尽管有人可以用编码做一些丑陋的事情,但进行替换可能根本没用,因为漏洞仍然有效。

编辑: 对 Sinatra 手册的简短阅读得出

By the way, unless you disable the path traversal attack protection (see below), the request path might be modified before matching against your routes.

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

Are there any negative implications to loading views in this manner?

时间会是一个,生成页面比提供静态页面花费的时间要长得多。出于同样的原因,资源使用将是另一个。又增加了复杂性。另当别论。

为什么不 put static pages in the public directory? Or why not use a static site generator?

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