我正在开发一个网络应用程序,用户可以在其中提供服务器然后将变量替换为的字符串。
我最好使用PEP 3101 format()语法,我正在研究在Formatter中覆盖方法的可行性,以确保它对不受信任的输入是安全的。
以下是我可以看到的.format()风险:
我的假设是:
你有什么想法?可能?不可能?仅仅是不明智的?
编辑:如果你没有过滤掉dunder变量访问,Armin Ronacher概述了一个令人讨厌的信息泄漏,但似乎认为安全格式()是可行的:
{local_foo.__init__.__globals__[secret_global]}
http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/
(就我个人而言,我实际上并没有在我的产品中使用不受信任的format()路由,但为了完整起见我正在更新)
答案 0 :(得分:7)
本能很好。是的,能够提供任意格式字符串的攻击者是python下的漏洞。
Object
父类有任何用处
信息。提供给格式的对象必须包含
敏感的东西。无论如何,这种符号可以限制
使用正则表达式。查看您不希望用户使用正则表达式的python format string specification和禁止的功能。
答案 1 :(得分:0)
此简单的Formatter覆盖阻止用户访问属性。它仍然允许格式化和转换类型。
from string import Formatter
class SafeFormatter(Formatter):
def get_field(self, field_name, args, kwargs):
if '.' in field_name or '[' in field_name:
raise Exception('Invalid format string.')
return super().get_field(field_name,args,kwargs)
form = SafeFormatter()
fname = form.format(format,num=1,id='hello')