Безопасный способ выполнения команд на сервере Linux, когда часть команды из пользовательского ввода - PullRequest
3 голосов
/ 20 февраля 2012

Я рассматриваю веб-приложение, которое предоставляет пользователю возможность изменять свой пароль Unix через веб-интерфейс.Аутентифицированный веб-пользователь дает свое имя пользователя в Unix и желаемый пароль.Внедрение команд здесь является очевидным вектором атаки.

Входные данные проверяются и обрабатываются путем назначения имен пользователей только в:/^[a-zA-Z0-9]+$/

После этого он делает что-то вроде (в python):

p = os.popen("/usr/bin/passwd " + username, "w")

и т. Д. И т. П.

Если у них не было этого регулярного выражения,имя пользователя, например jon; rm -rf, будет катастрофическим для системы или для пользователей.

Я не хочу что-то более фундаментальное, что не будет позволять мне вредить себе, даже если плохой ввод подобного рода уступит местов систему / попен вызов.(Например, подпроцесс )

Есть ли более безопасный способ сделать это, или проверка ввода остается единственной защитой?Я искал что-то более безопасное, чем system / popen или другой подход вообще, если есть стандартный способ выполнения команд, когда часть команды поступает из пользовательского ввода.

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Вы могли бы процитировать ввод самостоятельно:

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])
0 голосов
/ 21 февраля 2012
...