未在服务器上验证简单电子邮件表单会产生什么后果。
请记住:
我想使用的PHP代码是:
<?php
$post_data = filter_input_array( INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS );
$full_name = $post_data["full_name"];
$email_address = $post_data["email_address"];
$gender = $post_data["gender"];
$message = $post_data["message"];
$formcontent = "Full Name: $full_name \nEmail Address: $email_address \nGender: $gender \nMessage: $message \n";
$formcontent = wordwrap($formcontent, 70, "\n", true);
$recipient = "myemail@address.com"; $subject = "Contact Form"; $mailheader = "From: $email_address \r\n";
mail($recipient, $subject, $formcontent, $mailheader);
echo 'Thank You! - <a href="#"> Return Home</a>';
?>
简单的验证码会解决安全问题吗?
更新:
我真的想回答几个问题: 如果我不担心发送无效数据,我可以做的绝对最低限度是提高安全性。基本上避免灾难。
我应该提一下,这个代码是在表单生成器中生成的,我希望避免我的用户受到攻击。可以通过添加Captcha来对垃圾邮件进行排序。
更新: 什么是最糟糕的情况?
更新: 真的很感谢所有答案!
我打算做的几件事情:
像Alex提到的那样添加: filter_var(“$ post_data ['email_address']”,FILTER_VALIDATE_EMAIL);
添加简单的验证码
如果我确实添加了简单的服务器端验证,我应该验证什么?即使我正在验证它,用户仍然无法发送无效数据吗?
另外,上面会阻止垃圾邮件吗?
答案 0 :(得分:6)
当没有javascript存在时不会进行验证,可能也没有...
您认为垃圾邮件机器人是否启用了JavaScript?
额外注意事项将是攻击者
如果我正在攻击您的表单,我会首先看到您的javascript验证..接下来我会关闭javascript然后重试...
仅使用客户端验证的后果与根本不使用验证相同......
简单的验证码会解决安全问题吗?
除非它是服务器端......
答案 1 :(得分:3)
如果没有验证,他们可以使用注入来添加CC:和BCC等值:通过表单向其他人发送电子邮件。所以我建议您至少添加:
filter_var("$post_data['email_address']", FILTER_VALIDATE_EMAIL);
如果您检查电子邮件是否有效,他们可以做的最糟糕的事情就是向您发送无效数据。
答案 2 :(得分:3)
答案 3 :(得分:1)
只要浏览器支持JS,JS验证就非常出色。不幸的是,仍有浏览器缺乏JS支持。
但是,当您不执行服务器端验证时,您将mail()暴露给注射器。我可以创建我自己的nastyFile.html,在其中我放置一个formular wich action =“http://yousite.com/yourEmailHandler.php”,通过这样做,我可以省略你的JS验证
答案 4 :(得分:1)
任何人都可以欺骗他们的HTTP GET / POST请求:
这只是让事情变得简单。可能有各种各样的动机。您可能会在数据库中获得篡改(不一致/不清洁)数据的风险。您冒得获得DoS-ed的风险(例如,通过接收降低服务器的精心设计的响应,或者长时间持有请求处理程序(线程)导致连接超时)
这只是表面上的问题,因为一旦你的网站不安全,就无法知道可以利用什么。
答案 5 :(得分:1)
通过使用filter_input_array()
,您 进行一些服务器端验证(或清理,在这种情况下相同的事情)。此外,通过硬编码收件人的电子邮件地址,您已经填补了典型电子邮件表单中最糟糕和最常见的漏洞。无论是运气还是设计,看起来在这种情况下实际上可能就足够了。
通常,电子邮件表单中的漏洞可分为两大类:
在您的情况下,您使用用户提供的数据所做的一切(就您所展示的代码而言,无论如何)都将其传递给mail()
,这有望避免重大安全孔。 (但话说再说一遍,这个是 PHP,所以...)至于欺骗你的脚本向错误的收件人发送垃圾邮件,有(再次)基本上有两种方法可以做到这一点:
幸运的是,您已将电子邮件地址硬编码到脚本中,并且您选择的清理方法(FILTER_SANITIZE_SPECIAL_CHARS
)将替换换行符与HTML字符实体。所以看起来你可能对这两种攻击都是安全的。当然,有人仍然可以使用该表单(或多或少)向你发送任意电子邮件,但可能这是你愿意承担的风险。
尽管如此......
我几乎无懈可击,可能存在我在上面的分析中遗漏的潜在安全问题。一般来说,检查输入越严格,就越不容易受到意外攻击。例如,我非常赞同其他人在此提出的建议,即对用户提供的电子邮件地址(更常见的是,可能最终出现在电子邮件标题中的任何数据)应用额外的验证步骤。
答案 6 :(得分:0)
这是一种安全风险
编辑:
$post_data
包含表单中的项目 - $email_address
是构成$mail_header
的项目。您可以使用它将东西注入邮件头。
答案 7 :(得分:0)
一个结果可能是,如果浏览器javascript关闭或某些专家用户使用firebug或其他工具更改javascript验证的行为而不是您可能获得无用的信息