【问题标题】:Filter/sanitizing email subject and body in PHP在 PHP 中过滤/清理电子邮件主题和正文
【发布时间】:2017-05-16 03:12:02
【问题描述】:

我正在使用 PHPMailer 发送电子邮件。

现在,我们都知道我们需要始终检查用户输入。
但是电子邮件的主题和正文呢? (所以我不是指电子邮件地址)

什么需要消毒以及如何消毒? (主要)漏洞是什么?

我应该为此使用 HTMLPurifier 之类的东西吗?因为我希望用户能够标记那里的电子邮件。或者我应该使用/编写一个可以使用的 BB 代码函数吗?

更新:

对于邮件正文:
我现在使用带有 ent_quotes 标志的 htmlspecialchars。在此之后,对消息运行 BB 代码 (jBBCode) 解析器。这个现在看起来很安全。

主题:
我不使用任何验证/消毒/等。 (除了最小和最大 strlen)在主题字段上。 用一些 javascript 测试,但看起来一切正常。

我可以假设现在这是安全的吗? (P.s. 代码不会打印在电子邮件以外的任何地方。)

【问题讨论】:

    标签: php email phpmailer html-email sendmail


    【解决方案1】:

    是的,您需要在发送前清理用户输入。 HTMLPurifier 和 HTMLawed 在清理方面做得相当不错,但需要进行调整以不阻挡有用的东西——两者都在谨慎方面犯了错误。 BBCode 或 markdown 确实让过滤变得更容易,只要您不需要进行复杂的布局。

    【讨论】:

    • 请再次查看我更新的问题并给我您的想法。我会更新一些信息。
    【解决方案2】:

    你可以使用

    <?php
    filter_var($body, FILTER_SANITIZE_FULL_SPECIAL_CHARS)
    

    为了帮助防止特殊字符,您还可以使用 RAW,例如

    <?php
    filter_var($body, FILTER_SANITIZE_RAW, FILTER_FLAG_ENCODE_HIGH)
    

    完整的细节可以在这里找到 -> https://secure.php.net/manual/en/function.filter-var.php

    【讨论】:

    • 这些会让事情变得安全,但不允许任何标记工作。
    • 使用此错误,例如:使用未定义的常量 FILTER_SANITIZE_RAW - 假定为“FILTER_SANITIZE_RAW”(这将在 PHP 的未来版本中引发错误)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2015-06-14
    • 2020-11-12
    • 1970-01-01
    相关资源
    最近更新 更多