发送电子邮件时是否需要退出POST?

时间:2013-08-23 08:10:26

标签: escaping php

我有以下代码:

<?php

    $email_from = "oshirowanen@localhost.com";
    $email_to = $_POST["referred_email"];
    $email_subject = 'test subject here';
    $email_message = $_POST["referred_message"];

    // create email headers
    $headers = 'From: '. $email_from ."\r\n".
    'Reply-To: '. $email_from ."\r\n" .
    'X-Mailer: PHP/' . phpversion();

    if (filter_var($email_to, FILTER_VALIDATE_EMAIL)) {
        $result = mail($email_to, $email_subject, $email_message, $headers); 
        echo 'Mail accepted for delivery ';
    } else {
        echo 'Mail could not be sent ';
    }

?>

是否应该以任何方式逃避任何POST值以防止用户进行恶意操作?如果是,应该使用哪种转义方法?魔术报价?

我正在使用PHP 5.x。

5 个答案:

答案 0 :(得分:1)

是的,所有这些都需要转义或至少经过验证。

例如,您的email_to可能包含数千个地址 - 这可能适用于您的用例,但我对此表示怀疑。

此外,POST参数将进入邮件头,这是一个危险的操作,因为它可以操纵邮件服务器执行与预期完全不同的操作。

答案 1 :(得分:1)

您的代码的所有输出都应以适当的方式进行转义或清理。这包括作为电子邮件发送的输出。

在编写电子邮件标题时,您需要非常警惕地保护自己免受可能导致邮件被发送到任意地址以及任意内容的注入攻击。

最终,这取决于确保您的电子邮件地址有效且不包含任何换行符等,而您当前的FILTER_VALIDATE_EMAIL代码是处理此问题的良好开端。

然而,就目前而言,您的程序基本上允许用户将他们喜欢的任何内容发送给他们喜欢的任何收件人。他们只有硬编码的部分是你的“来自”地址。这听起来像是一个公开的邀请,用它来发送垃圾邮件,无论你有什么逃避。

如果这是您的实际代码,我建议您重新考虑它正在做什么!

完成后,我会建议您下载phpMailer class的副本,并使用它来发送PHP中的电子邮件而不是内置的mail()函数。它使用起来容易得多,功能更多,最重要的是,它可以为您完成所有验证,清理和逃避,因此您不必再担心它了。

希望有所帮助。

答案 2 :(得分:0)

逃避用户获得的任何内容。它可以是任何东西。

答案 3 :(得分:0)

首先,大多数人混淆了“逃避”这个词的含义。

他们将其视为某种“使数据神奇安全,无论数据性质还是目的地”。大部分时间都会考虑以向其他角色添加一些字符的形式。

当然,没有这样的逃避存在。

实际上,数据必须格式化验证取决于其目标的性质。任何“逃避”只能是这种格式的部分,甚至根本不使用。

在此特定情况下,数据会添加到邮件标题邮件正文

标题易于主注射 - 因此,必须检查它们是否包含没有换行符。 你是正确的检查电子邮件。
只要您对主题进行硬编码,它显然不需要验证。但是,如果您从表单中获取它,也必须进行验证。确保其中没有换行符。

只要您发送纯文本邮件,邮件正文就被认为是安全的。

因此,您的代码目前看起来很安全。

但是,使用开放地址这样的邮件表单的想法可以用作垃圾邮件门 - 实际上,任何人都可以从您的名字发送电子邮件对任何人。

答案 4 :(得分:-1)

这将导致Email Injection。您应该阅读以下文件:

http://www.phpsecure.info/v2/article/MailHeadersInject.en.php