我正在处理某些表单,并希望获得有关如何正确使表单安全抵御黑客,垃圾邮件等的建议。此外,我想知道如何正确地通过电子邮件发送此表单数据(附件将也被发送,所以我使用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实体(假设我想发送纯文本电子邮件)?
感谢您的帮助!
答案 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地址,并且可以毫不费力地发送电子邮件。
希望这有帮助。