我正在审核一个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更安全的东西或完全不同的方法。
答案 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)