首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转义Shell回显

转义Shell回显
EN

Stack Overflow用户
提问于 2011-02-22 07:32:23
回答 2查看 284关注 0票数 4

我试着做我的研究,有丰富的方法调用shell命令,甚至更多的方法来删除有害的字符,我来stackoverflow专家的最佳建议。

我希望找到像我见过的其他语言一样的东西,这样向命令发送参数实际上是通过函数传递的,比如:

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

它将为您处理$Directory变量中任何有害的内容。我还没有在PHP中发现这一点。

这是我正在使用的代码:

代码语言:javascript
复制
<?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“帐户。

所有的会话变量都包含超文本标记语言(<br><b>,等等)和一些$_POST变量。

我知道使用echo是一种可怕的方式,这就是为什么我要使用stackoverflow。我在这里的目标是,无论他们向我抛出任何疯狂的字符,电子邮件都能通过。我知道shell/bash很挑剔--我认为它不仅仅是转义双引号。

我试过使用escapeshellcmdescapeshellarghtmlentities,它们要么漏掉太多,要么把电子邮件中的超文本标记语言搞乱了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-22 10:29:59

将电子邮件内容写入文件,然后将文件内容重定向为msmtp命令的输入。

代码语言:javascript
复制
file_put_contents($tempfile,$Email);
exec("msmtp --account=$Account $To < $tempfile");
票数 2
EN

Stack Overflow用户

发布于 2011-02-22 08:54:41

PHP使用的是Bourne shell (sh)还是Bash?在这两种情况下,最好使用printf

代码语言:javascript
复制
exec("printf '%s' '$Email' | msmtp --account=$Account $To");

如果您正在使用Bash,您可以尝试它的printf的报价功能

代码语言:javascript
复制
exec("printf '%q' '$Email' | msmtp --account=$Account $To");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5072493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档