2012-02-20 52 views
3

我在审查一个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更安全的方法或完全不同的方法。

+0

做它的正则表达式的方法是标准的东西,建立一个完整的沙盒是一个__LOT__更多的工作。 – orlp 2012-02-20 17:57:02

+0

@nightcracker:不,在这种情况下这样做的正则表达式不是标准的东西。使用正确的模块是标准的东西。 – 2012-02-20 17:59:01

+1

+1因为想要正确地做到这一点。有人在SO上至少每天发布一次公然注入易受攻击的代码。 – 2012-02-20 18:00:01

回答

3

可能报价输入自己:

import pipes 
p = os.popen("/usr/bin/passwd " + pipes.quote(username), 'w') 

os.popen但反对和pipes.quote是一个未公开的函数,所以你会好得多只是用subprocess模块:

import subprocess 
p = subprocess.Popen(["/usr/bin/passwd", username]) 
+0

完美,谢谢你的回答。子过程也是我最好的猜测。 – CodeExpress 2012-02-21 19:52:06