2014-02-09 47 views
0

我有一個想法可以將模板放在數據庫中,並且可以讓設計人員直接從CMS面板編輯模板。但困擾我的是安全問題。如果我們有能力直接在模板中放入python命令,它怎麼可能是安全的。如果我在mako模板中有這樣的東西:Mako模板和安全

<%! 
import os 

os.system('rm /var/www/env/harmless.txt') 
%> 

它會執行成功且harmless.txt將被刪除。我應該找到另一個除Mako以外的模板引擎,或者我可以以某種方式配置Mako以防止有害的代碼注入?另一方面,一些python命令在模板中非常有用,例如,如果語句內聯

+0

我不是太woried有關,如果人們都運行自己的CMS 。他們爲什麼會試圖造成傷害?如果您擔心安全問題,那麼只需在沙箱中運行python即可。 –

+0

您可以完全通過使用JavaScript模板系統消除問題,並在客戶端執行所有呈現(和代碼執行)。 EJS和茶杯都很好,雖然茶杯基於咖啡標記,如果你只是使用直線JS,會增加額外的複雜程度。 – umeboshi

回答

1

如果他們有自己獨立的CMS實例,就像Loic指出的那樣無關緊要。但是如果他們在一些共享的環境中,最好使用另一個模板引擎。問題Untrusted templates in Python - what is a safe library to use?建議Django templatesJinja2

+0

然而,mako引擎現在有一個預處理器功能,我想到了它。您可以預處理模板以刪除任何您不想要的東西。 –

+0

「你不想要」聽起來像管理一個黑名單,這從來不是一個安全的好主意。如果可能,最好使用已保存的內容。但是,會是一個可能的解決方案。 – tea2code

1

仍然有可能做你想做的事。 mako引擎可以讓您爲模板添加預處理器。我不能肯定地說,我當時可以考,但你可以有這樣的事情:

這裏:http://docs.makotemplates.org/en/latest/usage.html#mako.template.Template.params.preprocessor

def removeImports(source): 
    # remove whatever you don't want inside the template 
    return new_source 

tpl = Template(...., preprocessor=removeImports) 

如果您使用的是框架狀pyramid你可以把它一個新的渲染器可以在所有模板上爲您執行此操作。

作爲一個安全問題,如果你想這樣做,因爲Mako在我看來是一個非常好的引擎。你應該在你的預處理器上做一組好的測試用例。我很確定可以在內聯python <% %>內實現導入。實際上,imports幾乎可以在模板內的任何位置實現,因爲幾乎可以在任何地方使用內聯python。

所以,如果你conerned約在模板運行的巨蟒,你可以考慮其他的模板,如變色龍,Jinja2的...