2015-04-04 43 views
0

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

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 

回答

1

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

如果你没有在你的pages目录中的任何奇怪的符号链接的话,大概是足以替代的东西,如所传递的字符串.gsub(/\.+/, ".")点的所有双OCCURENCES(或更换所有的点,如果你不需要它们以更加偏执狂的名义)。我不确定是否有任何多字节的不安全感,因为某些人可以通过编码来做一些丑陋的事情,而且根本不用做替换,因为这种方法仍然有效。

编辑:短读入西纳特拉人工产生的是

顺便说一句,除非你关闭路径遍历攻击保护(见下文),请求路径可能对你的路由匹配之前被修改。

因此,它接缝,它应该是安全的,只需使用参数值没有任何特殊的过滤,但你可能喜欢再看看文档(特别是安全部分)。但是,如果可以确定pages目录中的文件是否存在,我认为这不是太大的安全问题。

0

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

时间将是一个,生成一个页面需要很长的时间而不是静态的。由于相同的原因,资源使用将是另一个。又增加了复杂性。重新创造轮子将是另一回事。

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

挑选一个适合您需要的工具,而不要重新发明轮子(尤其是当框架已经与车轮上你!)

+0

我计划导出为静态HTML,我使用Sinatra :: Export,这不适用于上面的代码示例。我将不得不遍历我的网页目录中的所有文件,调用get“/#{filebasename}”并调用haml“pages /#{filebasename}”我也不认为渲染HAML在这实例,尤其是考虑到可读性和可维护性的折衷。 静态站点生成器并不能真正满足我的需求,而且通常不够灵活。 – user1152226 2015-04-05 22:23:20

+0

@ user1152226静态网站生成器完全符合您所说的目标 - 生成并提供静态文件。灵活性... YAGNI,无论如何,这些文件都在haml中,如果你以后需要的话,这不会是一个巨大的变化。至于*有*循环遍历目录中的所有文件......一个班轮。你甚至可以使用上面所写的内容,并将其写为卷曲请求以避免静态站点生成器。据我所知,你获得绝对零的选择你有。 – iain 2015-04-05 22:59:57