Python3 - очистка пользовательского ввода, передаваемого в оболочку в качестве параметра - PullRequest
0 голосов
/ 25 августа 2018

Каков рекомендуемый метод очистки user_input_parameter, передаваемого в оболочку, как

subprocess.Popen(['sudo', 'rm -rf', user_input_parameter])

Команда должна принимать все параметры, но злонамеренные действия, такие как выход из команды, должны быть смягчены.

1 Ответ

0 голосов
/ 26 августа 2018

Реализация Python subprocess защищает от внедрения оболочки, документация говорит так:

17.5.2. Вопросы безопасности

В отличие от некоторых других попсовых функций, эта реализация никогда не будет неявно вызвать системную оболочку. Это означает, что все персонажи, включая метасимволы оболочки, можно безопасно передать ребенку процессы. Если оболочка вызывается явно, через shell=True, это ответственность приложения за обеспечение того, чтобы все пробелы и метасимволы указаны в кавычках, чтобы избежать инъекции в оболочку уязвимости.

При использовании shell=True функция shlex.quote () может использоваться для правильно экранировать пробелы и метасимволы оболочки в строках, которые будут использоваться для создания команд оболочки.

Это, однако, НЕ защитит пользователя от передачи злонамеренного ввода - в вашем случае, например, удаление чего-то, что не было предназначено для удаления. Я бы не стал передавать пользовательский ввод в команду напрямую, как это - вы должны проверить, удаляется ли то, что вы хотите удалить, а не что-то совершенно другое. Это, однако, уже является частью логики приложения - относительно внедрения оболочки ( прерывание команды ) - это должно быть хорошо с subprocess.

Я сделал этот маленький пример:

#!/usr/bin/env python3

import subprocess

user_input_parameter = '/; id'
subprocess.Popen(['ls', user_input_parameter])

Что выводит это при выполнении:

$ python3 asdf.py
ls: /; id: No such file or directory
$

Для демонстрации subprocess передает входные данные в качестве аргумента параметра.

Все это верно только , если shell=False (по умолчанию на момент написания этого ответа) для subprocess методов, в противном случае вы в основном включаете выполнение оболочки (bash и т. Д.) И допускаете инъекцию в произойдет, если входные данные не будут должным образом санированы.


Кстати, вам нужно передать каждый параметр отдельно, поэтому вам нужно будет запустить его следующим образом (но, пожалуйста, не делайте этого):

subprocess.Popen(['sudo', 'rm', '-rf', user_input_parameter])
...