Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。 写于2016年12月29日,星期四 长时间以来,这对我来说,应该是很明确的了,但是直到今天早些时候,我才真正意识到这个问题的严重性,即当不可信的用户输入时,由str.format所引起的问题的严重性。它以一种允许你获取无权限访问的信息的方式成为绕开Jinja2 沙盒的一种办法,这就是为什么我刚刚为此推出了一个安全版本的原因。 然而,我认为这个普通的问题是相当严重的,而且需要讨论讨论,因为大多数人很可能没有意识到这个问题是多么容易被利用。 核心问题 从Python 2.6开始,一种新的格式化字符串的语法登陆了,这是由.NET所启发的。而且Rust及其它一些编程语言也支持同样的语法。 对字节和unicode字符串,.format()函数都是适用的(在Python 3上,只适用于unicode字符串)而且它也反映在自定义的string.Formatter API中。 它的特性之一是,你可以向将要格式化的字符串传送位置参数和关键字参数,而且可以在任何时候明确地重排元素顺序。然而,最大的特点是,你可以访问对象的属性及各个项目。在这里,后者就是引发问题的原因。 基本上,一个人是可以做如下事情的: 实质上,任何控制了格式化字符串的人都可能访问对象的内部属性。 这个问题发生在哪里? 第一个问题是为什么一个人能够控制格式化的字符串。有一些地方它会暴露出来:
危险级别 对于给格式化字符串只传递C解释器对象的情况,你就会稍微安全些,因为你可以发现的最坏事儿就是一些内部reprs对象如以上事实所示的某个东西是一个整数类。 然而,一旦Python对象被传进来,事情就会变得糟糕。原因是从Python函数暴露出的东西的数量是相当惊人的。这里有一个例子,一个假想会泄露密钥的网页应用程序设置的例子。 在这里,用户如果可以注入format_string,就可以发现像这样的密钥字符串: 将格式化过程装入沙盒 因此,如果你真的需要让别人提供格式化的字符串,你会怎么做?你可以通过使用还未写入文档的内部构件来改变这种行为。 现在,你可以使用safe_format函数来替换str.fromat了: 英文原文:http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|