Ускользающее эхо от снарядов
Я попытался провести свое исследование, существует просто множество способов вызова команд оболочки и еще больше способов удаления вредных символов, которые я использую в stackoverflow для лучшей рекомендации эксперта.
Я надеялся найти что-то похожее на то, что я видел на других языках, где отправка аргументов команде фактически передается через функцию, например:
Команда Do_command ("ls", "-l", $Каталог);
И он позаботится обо всем вредном в каталоге $ переменная для вас. Я не совсем нашел это в PHP.
Это код, с которым я работаю:
<?php
session_start();
$AdminEmail = "[email protected]";
$CatalogEmails = array("");
$QuoteEmails = array("");
$PartsEmails = array("");
$Subject = $_SESSION['Email_Subject'];
$Body = $_SESSION['Email_Body'];
$Headers = $_SESSION['Email_Headers'];
$Type = $_SESSION['Type'];
msmtp($AdminEmail, $Subject, $Body, $Headers, "meyers");
if ($Type == "Catalog") {
foreach ($CatalogEmails as $AdditionalEmail) {
msmtp($AdditionalEmail, $Subject, $Body, $Headers, "meyers");
}
} else if ($Type == "Quote") {
foreach ($QuoteEmails as $AdditionalEmail) {
msmtp($AdditionalEmail, $Subject, $Body, $Headers, "meyers");
}
} else if ($Type == "Parts") {
foreach ($PartsEmails as $AdditionalEmail) {
msmtp($AdditionalEmail, $Subject, $Body, $Headers, "meyers");
}
}
function msmtp($To, $Subject, $Body, $Headers, $Account) {
$Email = "To: $To\nSubject: $Subject\n$Headers\n\n$Body\n";
exec("echo \"$Email\" | msmtp --account=$Account $To");
}
session_destroy();
?>
Я знаю, что есть встроенная почтовая функция PHP, которая в значительной степени позаботится об этом, но я использую несколько SMTP-серверов, и msmtp
- это программа, которую я использую, которая отправляет электронные письма на основе "учетной записи", под которой будет отправлено электронное письмо. В этом случае это будет учетная запись "мейерс".
Все переменные сеансов содержат HTML (<br>
, <b>
и т. Д.) С некоторыми $_POST
переменными в и там тоже. Я использую PHP 5.3, поэтому никаких волшебных кавычек.
Я знаю, что использование echo - ужасный способ, поэтому я перехожу к stackoverflow. Моя цель здесь состоит в том, чтобы электронное письмо прошло, несмотря на любого сумасшедшего персонажа, которого они бросают в меня. Я знаю, что оболочка/баш придирчивы - я предполагаю, что это гораздо больше, чем просто избежать двойных кавычек.
Я пытался использовать escapeshellcmd
escapeshellarg
и htmlentities
, все они слишком много избегают или портят HTML в электронном письме.
2 answers
Запишите содержимое электронной почты в файл, затем перенаправьте содержимое файла в качестве входных данных команде msmtp.
file_put_contents($tempfile,$Email);
exec("msmtp --account=$Account $To < $tempfile");
Использует ли PHP оболочку Bourne (sh) или Bash? В любом случае, возможно, будет лучше, если вы используете printf
:
exec("printf '%s' '$Email' | msmtp --account=$Account $To");
Если вы используете Bash, вы можете попробовать функцию цитирования его printf
:
exec("printf '%q' '$Email' | msmtp --account=$Account $To");