当部分命令来自用户输入时,在linux服务器上执行命令的安全方法

时间:2012-02-20 17:54:15

标签: python security shell code-injection

我正在审核一个Web应用程序,该应用程序公开了用户通过Web界面更改其unix密码的功能。经过身份验证的Web用户会提供其unix用户名和所需的密码。 命令注入是一个明显的攻击向量。

通过强制用户名仅在以下位置验证和清理输入:
/^[a-zA-Z0-9]+$/

此后它执行类似(在python中):

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

依此类推。

如果他们没有那个正则表达式,像jon; rm -rf这样的用户名对于系统或popen来说将是灾难性的。

我想要一些更基本的东西不会允许我伤害自己,即使这样的错误输入让位于系统/ popen调用。 (例如。subprocess

是否有更安全的方式来做这个或输入的验证仍然是唯一的防御?如果有一种执行命令的标准方法,其中命令的一部分来自用户输入,我正在寻找比system / popen更安全的东西或完全不同的方法。

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分:0)