Python でサーバー/クライアント ソケット ペアを使用しています。サーバーは特定のコマンドを受信し、応答を準備してクライアントに送信します。
この質問では、私の懸念はコードへのインジェクションの可能性についてです.2番目のパラメーターで何か奇妙なことをサーバーに依頼できるかどうか-コマンドコンテンツの制御が望ましくない動作を回避するのに十分でない場合.
編集:
- 頂いたアドバイスによると
- Windows で
shell=True
呼び出すときにパラメーターを追加しました。check_output
コマンドは単純な「dir」であるため、危険ではありません。
.
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)