可以从配置文件中注入shell/python命令吗?
假设你有一些元数据,用于一个自定义文件格式,这个格式是你的Python应用程序读取的。就像一个可以变化的csv文件,里面的变量会随着文件的操作而改变:
var1,data1
var2,data2
var3,data3
那么,如果用户可以修改这些元数据,你是否需要担心有人会制作一个格式错误的元数据文件,从而让你的程序执行一些任意的代码呢?我能想到的唯一情况是,如果你做了一个不好的选择,把var1
设置成一个你用os.sys(data1)
执行的命令。还有,如果这是C语言的话,你就得担心缓冲区溢出的问题,但我认为在Python中你不需要担心这个。如果你把数据作为字符串读取,是否有可能以某种方式逃避字符串"\n os.sys('rm -r /')
的限制?这个类似SQL的例子肯定不行,但有没有类似的情况是可能的呢?
2 个回答
这完全取决于文件是怎么处理的,但一般来说这样做是安全的。在Python中,如果你想把文本当成代码来执行,那你得花点功夫。
如果你正在做的事情只是读取和解析简单的文本格式,那你就安全了。正如你所说,Python在处理一些常见的内存错误方面比C语言要安全得多,因为C语言的开发者如果不小心,容易出问题。你提到的SQL注入问题,在Python中简单读取文件时并不需要担心。
不过,如果你关心安全性,看来你是这样想的(插一句:这很好!一个好的程序员应该既懒惰又有点多疑),这里有一些需要考虑的事项:
验证所有输入。确保你读取的每一条数据都是预期的大小、类型、范围等等。尽早发现错误,不要把有问题的变量传递到代码的其他地方。
- 你知道变量的预期名称,或者至少知道它们的格式吗?在使用之前,确保验证它们是你所期望的类型。如果它应该只包含字母,就用正则表达式来确认一下。
- 你知道数据的预期范围或格式吗?如果你期待的是一个数字,确保在使用之前它确实是一个数字。如果它应该是一个短字符串,验证一下长度;你明白我的意思。
- 如果你收到了意想不到的字符或字节怎么办?如果有人给你发送了unicode字符呢?
- 如果这些是路径,确保在读取或写入之前,先将路径标准化,并确认它指向一个可接受的位置。
一些不要做的具体事情:
- os.system(攻击者控制的字符串)
- eval(攻击者控制的字符串)
__import__(攻击者控制的字符串)
- 对攻击者控制的内容进行pickle/unpickle(这里有原因)
另外,不要自己去设计配置文件格式,可以考虑使用ConfigParser或者类似的JSON格式。使用一个大家都熟悉的格式(和库)能帮助你更好地进行验证。
通常我会推荐OWASP作为“进一步阅读”的链接,但他们的输入验证页面需要改进。相对而言,这篇文章看起来比较实用:“安全程序员:验证输入”。还有一篇虽然有点旧,但更专注于Python的文章是“在Python中处理用户输入”。