2011-10-03 41 views
0

一位客户联系我们,担心近期有一些企图在她的网站上滥用联系我们表单。 显然,有人试图在消息字段中编写一些代码,很可能是为了垃圾邮件目的而使用后端脚本(使用这些时髦标头的电子邮件注入)。我应该采取什么样的安全预防措施来“联系我们”表单?

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

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

$namePattern = '/^[a-z0-9()\/\'":\*+|,.; \- !?&#[email protected]]{2,75}$/i'; 
$emailPattern = '/^[^@\s][email protected]([-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. 

对不起,如果有什么问题我的逻辑或我的语法,我并没有实际测试以上(因为该网站是活的,我想在测试之前尽可能多地写出代码)。

以上安全检查是否足够?我的模式检查是否正确(我主要是复制其他人的模式,因为我不完全理解符号)。

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

而且,这并不重要,但如果有人有时间,你能教我如何循环遍历数组并分配一个新的值给每个元素(IE的而不是写$array['c_date'] = remove ($array['c_date']);几次,一个简单的函数什么,没有工作对我来说。

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

+1

作为一般规则,如果你不理解它,这是不安全的。这是因为您可能会尝试在不打算使用的情况下使用它。例如,在标签内部使用htmlentities是一个安全漏洞,例如属性' href = ...',因为它不会阻止你希望的XSS攻击。知道为什么很重要。 – DampeS8N

回答

1

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

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

个人而言,我会重新向客户保证,任何插入到表单中的脚本/代码都不会执行,并且除非执行,否则不会造成危害。

1

只要正确地消毒你的输入就足够了。使用htmlspecialchars()htmlentities(),您也可以去掉任何<或>字符,这应该足够了。

+0

如何使用'htmlspecialchars()'或'htmlentities()',我只是传递一个字符串,它会删除所有的HTML属性和东西?感谢您的建议。 – zermy

+1

是的,你应该阅读[手册](http://il2.php.net/manual/en/function.htmlspecialchars.php) –

1

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

只要确保电子邮件没有用户输入。对于其他情况,可能发生的最糟糕的情况是您将收到垃圾邮件,只要您想让人们与您联系,就会发生。

相关问题