一位客户联系我们担心最近有人试图滥用她网站上的联系我们表格。 显然,有人试图在消息字段中编写一些代码,很可能是尝试将后端脚本用于垃圾邮件目的(使用那些时髦的标题的电子邮件注入)。
目前,安全性是一个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']);
,一个简单的功能或能为我完成工作的东西。
非常感谢你的帮助,祝你有个美好的一天!
答案 0 :(得分:1)
一般来说,关键是确保不会执行来自用户输入的任何内容。提供生成电子邮件的代码是对所有用户输入进行编码,然后不应该有太多问题。
模式匹配输入不会受到伤害(除非您特别希望用户能够输入特定值,如html代码)。
就个人而言,我会再次向客户保证,任何插入其表单的脚本/代码都不会被执行,除非被执行,否则无害。
答案 1 :(得分:1)
只需正确清理您的输入就足够了。使用htmlspecialchars()
或htmlentities()
,您也可以删除任何&lt;或者&gt;字符,这应该就够了。
答案 2 :(得分:1)
邮件表单最常见的问题来自网络上的错误代码示例,其中目标电子邮件是从表单中的隐藏字段中获取的,这允许攻击者替换该电子邮件并将服务器用作垃圾邮件中心
确保电子邮件不是用户输入的。对于其他人来说,可能发生的最糟糕的事情就是你会收到垃圾邮件,如果你想让别人联系你就会发生垃圾邮件。