我在 Python 中有一个服务器/客户端套接字对。服务器接收特定命令,然后准备响应并将其发送给客户端。
在这个问题中,我关心的只是代码中可能的注入:是否可以要求服务器使用第二个参数做一些奇怪的事情——如果对命令内容的控制不足以避免不希望的行为。
编辑:
- 根据收到的建议
- 在 windows 上
shell=True
调用时添加了参数。check_output
不应该是危险的,因为该命令是一个简单的“目录”。
.
self.client, address = self.sock.accept()
...
cmd = bytes.decode(self.client.recv(4096))
ls
: 执行系统命令但只读取目录的内容。
if cmd == 'ls':
if self.linux:
output = subprocess.check_output(['ls', '-l'])
else:
output = subprocess.check_output('dir', shell=True)
self.client.send(output)
cd
: 只是打电话os.chdir
。
elif cmd.startswith('cd '):
path = cmd.split(' ')[1].strip()
if not os.path.isdir(path):
self.client.send(b'is not path')
else:
os.chdir(path)
self.client.send( os.getcwd().encode() )
get
: 将文件内容发送给客户端。
elif cmd.startswith('get '):
file = cmd.split(' ')[1].strip()
if not os.path.isfile(file):
self.client.send(b'ERR: is not a file')
else:
try:
with open(file) as f: contents = f.read()
except IOError as er:
res = "ERR: " + er.strerror
self.client.send(res.encode())
continue
... (send the file contents)