Я добавляю форму обратной связи на веб-страницу и хотел бы знать, безопасно ли просто отфильтровать содержимое элемента TEXTAREA (после декодирования) с помощью команды «mail», чтобы отправить электронное письмо сопровождающему страницы.
Я просмотрел страницу руководства и не вижу способа злоупотребить этим, в частности, до тех пор, пока «mail» не работает в интерактивном режиме, экранирование тильды отключено и '.' на отдельной строке не завершает тело сообщения.
Но есть ли еще какая-то опасность, о которой я должен знать?
Команда выглядит примерно так:
echo "$MESSAGE_BODY" | mail webmaster@mydomain.com -s 'Website feedback'
Да, это опасно. Почтовое сообщение может содержать строки, начинающиеся с символа тильды ~, которые почтовой программой обрабатываются как escape-последовательности. Это включает в себя экранирование оболочки и добавление новых получателей. (мммм, спам!)
Просто посмотри на
$ man mail
Чтобы понять, что я имею в виду.
Здорово, что вы спрашиваете об этом - многие люди просто хотят выполнить свою работу и поэтому вводят целую кучу уязвимостей на базах, что «Ааа ... Все будет хорошо».
Сказав это, я думаю, что делать то, что вы делаете, нормально - но пока вы используете фильтр - и не фильтр, который вы написали сами, а фильтр с открытым исходным кодом (следовательно, открытый для всеобщего изучения), зрелый (существует какое-то время). Я бы также убедился, что фильтр удаляет любые HTML-теги и контент, которые могут содержать неприятные XSS-атаки.
Использование библиотеки с открытым исходным кодом, в которой вы можете ее найти, - вот что я имею в виду. (Никогда не используйте любой закрытые приложения безопасности - все они обречены на провал - и я могу поставить свою подпись в этом комментарии).
Я бы старался избегать вызова каких-либо команд из CGI. Я уверен, что на любом языке, который вы используете, должна быть библиотека для отправки электронных писем.
Не используйте почту, которая предназначена для конечных пользователей. Используйте команду "sendmail" (но не используйте этот проклятый кусок shblip, которым является программа sendmail), включенную в большинство MTA. Он предназначен для программного использования. Я знаю, что postfix и qmail, например, включают его.
cat mailmessage.txt | sendmail -ffrom@yourhost recipient@theirhost
Приложение: не обязательно «опасно» вызывать программу из CGI, если вы знаете, что делаете. В частности, как и в этом случае, убедитесь, что вызываемая программа не предназначена для конечных пользователей или не вызывается в интерактивном режиме (большинство таких программ позволяют создавать оболочку!)
Это огромная дыра в безопасности. Вот ресурс для написания безопасного кода CGI.
Чтобы дать вам представление, вот список персонажей со специальным использованием, о которых вам нужно знать:
Character Name Character Problems
backslash \ quoting
double quote " quoting
single quote ' quoting
dollar sign $ variable substitution
ampersand & command separator
greater than > I/O redirection
less than < I/O redirection
asterisk * file globbing
question mark ? file globbing
left bracket [ file globbing
right bracket ] file globbing
left paren ( word separator
right paren ) word separator
pipe | command separator
backtick ` subcommand execution
semicolon ; command separator
pound sign # comment character (sh only)
caret ^ command separator (sh only)
exclamation ! history execution (csh only)
tilde ~ username expansion (csh only)
carriage return <ascii 13> command separator
line feed <ascii 10> command separator
space word separator
tab ascii 9 word separator
NULL ascii 0 truncates input
Используйте библиотеку, которую кто-то уже реализовал и отладил. Формы электронной почты были созданы раньше, не изобретайте велосипед заново!
Какой CGI вы используете? Большинство языков / фреймворков cgi поддерживают отправку писем. Они всегда лучше, чем вызов внешних команд. Ну, PHP mail () действительно плох, но все же лучше, чем вызов внешних команд.
С точки зрения безопасности рекомендуется отправлять почту по SMTP (например, на localhost).