2

我有以下代码:

<?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。

4

5 回答 5

1

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

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

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

于 2013-08-23T08:13:22.030 回答
1

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

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

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

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

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

完成后,我会建议您下载phpMailer 类的副本,并将其用于在 PHP 中发送电子邮件,而不是使用内置mail()函数。它更易于使用,功能更多,最重要的是,它为您完成所有验证、清理和转义,因此您无需再担心。

希望有帮助。

于 2013-08-23T08:37:00.623 回答
0

逃避从用户那里得到的任何东西。它可以是任何东西。

于 2013-08-23T08:12:10.517 回答
0

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

他们将其视为某种“使数据神奇地安全,无论数据性质或目的地如何”。大多数时候,它被认为是以将一些字符添加到其他字符的形式。

当然,这种逃避是不存在的。

实际上,数据必须根据其目的地的性质进行格式化验证。并且任何“转义”都可能只是这种格式的一部分,甚至根本不使用。

在这种特殊情况下,数据被添加到邮件标题邮件正文中。

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

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

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

但是,这种带有开放地址的邮件表单的想法可以用作垃圾邮件门- 实际上,任何人都可以将您的姓名发送电子邮件给任何人。

于 2013-08-23T08:29:06.640 回答
-1

这会导致Email Injection. 您应该阅读以下文件:

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

于 2013-08-23T08:21:57.033 回答