Ускользающее эхо от снарядов


Я попытался провести свое исследование, существует просто множество способов вызова команд оболочки и еще больше способов удаления вредных символов, которые я использую в 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 в электронном письме.

Author: ParoX, 2011-02-22

2 answers

Запишите содержимое электронной почты в файл, затем перенаправьте содержимое файла в качестве входных данных команде msmtp.

file_put_contents($tempfile,$Email);
exec("msmtp --account=$Account $To < $tempfile");
 2
Author: Patrick Fisher, 2011-02-22 02:29:59

Использует ли PHP оболочку Bourne (sh) или Bash? В любом случае, возможно, будет лучше, если вы используете printf:

exec("printf '%s' '$Email' | msmtp --account=$Account $To");

Если вы используете Bash, вы можете попробовать функцию цитирования его printf:

exec("printf '%q' '$Email' | msmtp --account=$Account $To");
 1
Author: Dennis Williamson, 2011-02-22 00:54:40