我应该采取什么样的安全预防措施来“联系我们”?

时间:2011-10-03 18:33:10

标签: php validation contact-form email-injection

一位客户联系我们担心最近有人试图滥用她网站上的联系我们表格。 显然,有人试图在消息字段中编写一些代码,很可能是尝试将后端脚本用于垃圾邮件目的(使用那些时髦的标题的电子邮件注入)。

目前,安全性是一个JavaScript文件,可以在提交之前验证表单。后端没有任何检查。

所以,我在后端添加了一些验证,只是一些简单的东西,比如:

 $namePattern = '/^[a-z0-9()\/\'":\*+|,.; \- !?&#$@]{2,75}$/i';
 $emailPattern = '/^[^@\s]+@([-a-z0-9]+\.)+[a-z]{2,}$/i';
 $phonePattern = '[0-9\.\-]';
 $array = $_POST;
 //This is the first line of defense.
 if (!preg_match ($namePattern, $array['c_firstname']){
    die ("Please go back and enter a correct first name");  
 }
 ...More if statements to check other fields. 
 //The second line of defense.
 function remove($name){
     return( str_ireplace(array( "\r", "\n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:" ), " Something Replaced ", $name ) ); 
}
  $array['c_date'] = remove ($array['c_date']);
  //Check the rest of the array.

很抱歉,如果我的逻辑或语法出现问题,我还没有真正测试过上述内容(因为网站已经上线,我希望在测试之前尽可能多地编写代码)。< / p>

以上是否足够安全检查?我是否正确地进行了模式检查(我大多只是复制了其他人的模式,因为我并不完全理解符号)。

这个特殊的邮件表单使用Zend Mail,所以从理论上讲,它比普通的PHP邮件更安全。

此外,这并不重要,但如果有人有时间,你能教我如何在数组中循环并为每个元素分配一个新值(即不是多次写$array['c_date'] = remove ($array['c_date']);,一个简单的功能或能为我完成工作的东西。

非常感谢你的帮助,祝你有个美好的一天!

3 个答案:

答案 0 :(得分:1)

一般来说,关键是确保不会执行来自用户输入的任何内容。提供生成电子邮件的代码是对所有用户输入进行编码,然后不应该有太多问题。

模式匹配输入不会受到伤害(除非您特别希望用户能够输入特定值,如html代码)。

就个人而言,我会再次向客户保证,任何插入其表单的脚本/代码都不会被执行,除非被执行,否则无害。

答案 1 :(得分:1)

只需正确清理您的输入就足够了。使用htmlspecialchars()htmlentities(),您也可以删除任何&lt;或者&gt;字符,这应该就够了。

答案 2 :(得分:1)

邮件表单最常见的问题来自网络上的错误代码示例,其中目标电子邮件是从表单中的隐藏字段中获取的,这允许攻击者替换该电子邮件并将服务器用作垃圾邮件中心

确保电子邮件不是用户输入的。对于其他人来说,可能发生的最糟糕的事情就是你会收到垃圾邮件,如果你想让别人联系你就会发生垃圾邮件。