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

时间:2014-01-13 23:27:14

标签: php html forms security email

我正在处理某些表单,并希望获得有关如何正确使表单安全抵御黑客,垃圾邮件等的建议。此外,我想知道如何正确地通过电子邮件发送此表单数据(附件将也被发送,所以我使用enctype作为multiform / form-data)。

为简单起见,我们假设表格中只有一个字段。

    <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()并检查&#39;用户地址&#39; (在$ _POST中)是空的或不是。但我还应该做些什么呢?我已经看到有关htmlentities()和htmlspecialchars()的内容,让我感到困惑。我应该使用那些吗? striplashes()怎么样?

在确保输入是安全的之后,我想发送一个用户在正文中输入的电子邮件(使用PHPMailer)。我注意到的是,如果用户输入单引号或双引号,就像&amp;#34;显示在电子邮件正文中而不是实际字符中。这是因为电子邮件是作为PLAIN TEXT发送的吗?我希望它以纯文本形式发送,因为它只需要我所拥有的表单字段。所以我在$ _POST [&#39;用户地址&#39;]上使用了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实体(假设我想发送纯文本电子邮件)?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

黑客电子邮件表单要求黑客能够覆盖电子邮件的标题,因此修改所有内容,但也删除所有“\ n”和“\ t”,因为即使它们仍然可以用来破解标题文本被修剪。如果您有主题输入,则可以使用它来重写电子邮件的标题。 EX:

  

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

身体也可以被覆盖(不确定这是否真的有效,但我确信原则是正确的。)

如果您要发送html电子邮件(内容类型设置为电子邮件),则使用htmlentities()是一件好事,否则只要您将电子邮件的内容类型设置为纯文本,就不需要它。如果你想确保在另一边没有评估html,只需用“&gt;”中的replace()来制作标签。到“&amp; gt;”或者只是删除它们。

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

希望这有帮助。