创建安全的 HTML/PHP 表单和发送电子邮件

Posted

技术标签:

【中文标题】创建安全的 HTML/PHP 表单和发送电子邮件【英文标题】:Creating secure HTML/PHP Forms and Sending E-mails 【发布时间】:2014-02-01 21:56:13 【问题描述】:

我正在处理一些表单,并希望获得有关如何正确使表单免受黑客、垃圾邮件等攻击的建议。此外,我想知道如何在电子邮件中正确发送此表单数据(附件将也被发送,所以我使用 enctype 作为 multiform/form-data)。

为简单起见,假设我的表单中只有 1 个字段。

    <form method="post" enctype="multipart/form-data">
        Address: <input type="text" name="user-address" value="<?php echo $_POST['user-address']; ?>" />
        <input type="submit" value="Submit" />
    </form>

现在,为了确保用户输入安全,我需要执行哪些步骤?例如,我知道我可以做 trim() 并检查“用户地址”(在 $_POST 中)是否为空。但我还应该做什么?我一直在看到关于 htmlentities() 和 htmlspecialchars() 的东西,这让我很困惑。我应该使用那些吗? stripslashes() 呢?

确保输入安全后,我想发送一封电子邮件(使用 PHPMailer),说明用户在正文中输入的内容。我注意到的是,如果用户输入单引号或双引号,例如 " ;显示在电子邮件正文中,而不是实际字符中。这是因为电子邮件是以纯文本形式发送的吗?我希望它以纯文本形式发送,因为这就是我拥有的表单字段所需要的全部内容。所以我在 $_POST['user-address'] 上使用了 html_entity_decode(..., ENT_QUOTES) 并且使它工作。但是,我不确定这是否是正确的方法,或者这是否会带来某种安全风险。

    $msg = "Address: " . html_entity_decode($_POST['user-address'], ENT_QUOTES);
    //send e-mail with attachment and $msg as body

要点:我怎样才能确保上面的简单表格是安全的?以及如何处理电子邮件中显示的单引号和双引号 HTML 实体(假设我要发送纯文本电子邮件)?

感谢您的帮助!

【问题讨论】:

Security considerations when creating an email form on the web 的可能重复项 【参考方案1】:

首先,您应该检查电子邮件本身是否有效。使用正则表达式有很多方法可以做到这一点,或者如果您使用新版本的 php,您可以使用 filter 函数。在这里,您可以进一步确保域存在并响应 ping/http 调用。

黑客电子邮件表单要求黑客能够覆盖电子邮件的标题,因此修剪所有内容,但还要删除所有“\n”和“\t”,因为即使文本被修剪。如果你有一个主题输入,那么它可以用来重写电子邮件的标题。例如:

我的电子邮件 \n\t\n\tto:someone@somewhere.example\n\tbcc:spamlist\n\t\n\t 主题

并且body也可以像那样被覆盖(不确定这是否真的有效,但我确信原理是正确的)。

如果你发送一个html邮件(内容类型设置为email),使用htmlentities()是一件好事,否则你不需要它,只要你将邮件的内容类型设置为纯文本。如果您想确保在另一侧没有评估 html,只需使用 replace() 从 ">" 到 ">" 来制动标签或者干脆删除它们。

另一个好的做法是在表单中添加验证码,记住一个机器人可以有多个 IP 地址,它会毫不费力地发送电子邮件。

希望这会有所帮助。

【讨论】:

【参考方案2】:

在尝试确保用户输入安全时,有几件事需要注意。首先,htmlentities() 策略正在引导您走向正确的方向。我自己的输入有问题,htmlentities() 完成了工作。如果要保持引号不转义,请不要使用附加的 ENT_QUOTES 参数。此外,如果您要在数据库中的任何位置使用输入文本,请应用 mysql_real_escape_string() 函数。

【讨论】:

mysql_real_escape_string() - 不要使用贬值的 mysql,请验证电子邮件地址

以上是关于创建安全的 HTML/PHP 表单和发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

iOS中的自定义表单[重复]

创建电子邮件表单,用户在其中选择目标电子邮件并从自己的电子邮件中发送

使 ASP.Net 文件上传安全

已发送邮件不显示带有自定义 Outlook 消息表单的邮件跟踪

关于如何使用从其电子表格的html表单接收的数据创建pdf并通过电子邮件发送pdf文件的Google应用程序脚本

处理安全问题的基本php表单