我在审查一个Web应用程序,该应用程序公开用户可通过Web界面更改其unix密码的功能。经过身份验证的Web用户提供了他的unix用户名和他想要的密码。命令注入在这里是一个明显的攻击向量。当部分命令来自用户输入时,在Linux服务器上执行命令的安全方式
输入被验证和消毒通过强制用户名是仅在:/^[a-zA-Z0-9]+$/
此后它类似的信息(在python):
p = os.popen("/usr/bin/passwd " + username, "w")
等等等等。
如果他们没有这个正则表达式,像jon; rm -rf
这样的用户名对系统或popen来说是灾难性的。
我wan't更根本的是不会让我伤害自己即使这样糟糕的输入方式使得该系统/ POPEN调用。 (例如subprocess)
有没有更安全的方法来做到这一点或验证输入仍然是唯一的防御?如果有一种执行命令的标准方法,其中一部分命令来自用户输入,我一直在寻找比system/popen更安全的方法或完全不同的方法。
做它的正则表达式的方法是标准的东西,建立一个完整的沙盒是一个__LOT__更多的工作。 – orlp 2012-02-20 17:57:02
@nightcracker:不,在这种情况下这样做的正则表达式不是标准的东西。使用正确的模块是标准的东西。 – 2012-02-20 17:59:01
+1因为想要正确地做到这一点。有人在SO上至少每天发布一次公然注入易受攻击的代码。 – 2012-02-20 18:00:01