Экранирование Shell эхо - PullRequest
       23

Экранирование Shell эхо

4 голосов
/ 22 февраля 2011

Я пытался провести свое исследование, есть только множество способов вызова команд оболочки и еще больше способов убрать вредные символы, которые я собираюсь использовать в stackoverflow по лучшей рекомендации эксперта.

Я былв надежде найти что-то похожее на то, что я видел в других языках, поэтому отправка аргументов команде фактически передается через функцию, например:

do_command ("ls", "-l", $ Directory);

и он позаботится о чем-либо вредном для вас в переменной $ Directory.Я не совсем нашел это с PHP.

Вот код, с которым я работаю:

<?php
    session_start();

    $AdminEmail = "random_email@gmail.com";
    $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 - это программа, которую я использую, которая отправляет электронные письма на основании «учетной записи», под которой будет отправляться электронное письмо.В этом случае это будет учетная запись «meyers».

Все переменные сеанса содержат HTML (<br> <b> и т. Д.), А также некоторые $_POST переменные.Я использую PHP 5.3, поэтому никаких магических кавычек.

Я знаю, что использование эха - ужасный путь, поэтому я перехожу к stackoverflow.Моя цель заключается в том, чтобы электронное письмо проходило, несмотря на то, что на меня бросали сумасшедшие персонажи.Я знаю, что оболочка / bash привередлива - я предполагаю, что это намного больше, чем просто избегать двойных кавычек.

Я пытался использовать escapeshellcmd escapeshellarg и htmlentities, они все слишком много избегают или портятHTML в электронном письме.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

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

file_put_contents($tempfile,$Email);
exec("msmtp --account=$Account $To < $tempfile");
1 голос
/ 22 февраля 2011

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

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

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

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