我有一个我正在开发的Django应用程序,它必须对服务器上的外部程序进行系统调用.在为系统调用创建命令时,应用程序从表单中获取值并将其用作调用的参数.我想这意味着一个人基本上可以使用伪参数并为shell执行任意命令来执行(例如,只需放置一个分号然后rm -rf *
).
这是不好的.虽然大多数用户不是恶意的,但这是一个潜在的安全问题.如何处理这些潜在的利用点?
编辑(澄清):用户将看到一个表格,其中包含每个参数和选项的各种字段.但是,某些字段将作为打开文本字段提供.所有这些字段都合并并送入subprocess.check_call()
.但从技术上讲,这并不仅仅是将用户的命令提示交给用户.这必须相当普遍,所以其他开发人员如何清理输入以便他们不会得到Bobby Tables.
根据我对这个问题的理解,我假设你不是让用户指定在shell上运行的命令,而只是这些命令的参数.在这种情况下,您可以通过使用模块而不使用shell 来避免shell注入攻击(即指定在构造函数中使用default 参数.subprocess
shell=False
subprocess.Popen
哦,从来没有使用os.system()
含有从用户未来的任何输入的任何字符串.
从不信任用户.来自Web浏览器的任何数据都应被视为污染.并且绝对不要尝试通过JS验证数据或限制可以在FORM字段中输入的内容.在将服务器传递给外部应用程序之前,您需要在服务器上进行测试.
编辑后更新:无论您如何向前端的用户呈现表单,后端都应该将其视为一组带有大闪烁文本的文本框,说"插入您想要的任何内容!"