2015-04-04 99 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