不使用服务器端验证的后果?

时间:2011-10-05 18:39:02

标签: php

未在服务器上验证简单电子邮件表单会产生什么后果。

请记住:

  • 正在执行javascript验证
  • 没有相关数据库,这是一个简单的电子邮件表单

我想使用的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);

  • 添加简单的验证码

如果我确实添加了简单的服务器端验证,我应该验证什么?即使我正在验证它,用户仍然无法发送无效数据吗?

另外,上面会阻止垃圾邮件吗?

8 个答案:

答案 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请求:

  • netcat足以构建一个简单的GET请求
  • 简单的python / perl脚本足以制作修改后的POST提交
  • Firefox(可能还有很多其他人)拥有从浏览器中执行的插件(例如TamperData)
  • 可以使用方便的插件轻松启用/禁用/更改javascript
    • IE开发人员工具栏
    • Chrome开发工具栏
    • 萤火
    • Opera DragonFly

这只是让事情变得简单。可能有各种各样的动机。您可能会在数据库中获得篡改(不一致/不清洁)数据的风险。您冒得获得DoS-ed的风险(例如,通过接收降低服务器的精心设计的响应,或者长时间持有请求处理程序(线程)导致连接超时)

这只是表面上的问题,因为一旦你的网站不安全,就无法知道可以利用什么。

答案 5 :(得分:1)

通过使用filter_input_array(),您 进行一些服务器端验证(或清理,在这种情况下相同的事情)。此外,通过硬编码收件人的电子邮件地址,您已经填补了典型电子邮件表单中最糟糕和最常见的漏洞。无论是运气还是设计,看起来在这种情况下实际上可能就足够了。

通常,电子邮件表单中的漏洞可分为两大类:

  • 欺骗脚本执行其他而不是发送电子邮件或
  • 欺骗它将电子邮件发送到错误的地址(垃圾邮件)。

在您的情况下,您使用用户提供的数据所做的一切(就您所展示的代码而言,无论如何)都将其传递给mail(),这有望避免重大安全孔。 (但话说再说一遍,这个 PHP,所以...)至于欺骗你的脚本向错误的收件人发送垃圾邮件,有(再次)基本上有两种方法可以做到这一点:

  • 如果客户端可以提供收件人地址,垃圾邮件发送者可以随意传递任何内容;
  • 否则,他们可以使用e-mail header injection插入虚假收件人(和其他内容),一般是通过在数据中注入换行符。

幸运的是,您已将电子邮件地址硬编码到脚本中,并且您选择的清理方法(FILTER_SANITIZE_SPECIAL_CHARS)将替换换行符与HTML字符实体。所以看起来你可能对这两种攻击都是安全的。当然,有人仍然可以使用该表单(或多或少)向发送任意电子邮件,但可能这是你愿意承担的风险。

尽管如此......

我几乎无懈可击,可能存在我在上面的分析中遗漏的潜在安全问题。一般来说,检查输入越严格,就越不容易受到意外攻击。例如,我非常赞同其他人在此提出的建议,即对用户提供的电子邮件地址(更常见的是,可能最终出现在电子邮件标题中的任何数据)应用额外的验证步骤。

答案 6 :(得分:0)

  1. Javascript可能已停用
  2. 某人可以在您的代码中的邮件标题中添加任何内容。
  3. 这是一种安全风险

    编辑: $post_data包含表单中的项目 - $email_address是构成$mail_header的项目。您可以使用它将东西注入邮件头。

答案 7 :(得分:0)

一个结果可能是,如果浏览器javascript关闭或某些专家用户使用firebug或其他工具更改javascript验证的行为而不是您可能获得无用的信息