0

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

目前,现有的安全措施是一个 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.

抱歉,如果我的逻辑或语法有问题,我还没有实际测试过上面的内容(因为网站已经上线,我想在测试之前尽可能多地编写代码)。

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

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

此外,这不是那么重要,但如果有人有时间,你能教我如何循环遍历数组并为每个元素分配一个新值(即,而不是$array['c_date'] = remove ($array['c_date']);多次编写,一个简单的函数或执行为我工作。

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

4

3 回答 3

1

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

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

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

于 2011-10-03T18:39:02.803 回答
1

只需正确清理您的输入就足够了。使用htmlspecialchars()or htmlentities(),你也可以去掉任何 < 或 > 字符,应该足够了。

于 2011-10-03T18:40:07.403 回答
1

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

只要确保电子邮件没有来自用户输入。剩下的,可能发生的最糟糕的情况是您将收到垃圾邮件,如果您希望人们与您联系,无论如何都会发生。

于 2011-10-04T13:13:27.753 回答