【问题标题】:Preventing web site links and email addresses in a form when "Submit" is pressed按下“提交”时阻止表单中的网站链接和电子邮件地址
【发布时间】:2009-05-10 00:49:04
【问题描述】:

伙计们,

我有一个 html 表单,它将表单数据作为电子邮件发送。不幸的是,垃圾邮件机器人一直在填写表单,并在表单的消息部分发送网站链接和电子邮件地址。

有没有一种方法可以删除网站链接和电子邮件地址时按下“提交”按钮,然后再将其作为电子邮件地址发送?我使用 PHP 将表单数据作为电子邮件消息实际发送。

感谢和问候,

托尼

【问题讨论】:

    标签: php validation spam-prevention


    【解决方案1】:

    您是否尝试过使用hidden form via css(显示:无)但在 HTML 中像常规表单一样,并将其称为电子邮件或常见的东西,如果该表单有数据,那么它一定是机器人。

    【讨论】:

      【解决方案2】:

      如何使用正则表达式将与 Web 链接或电子邮件地址匹配的任何内容替换为空字符串。

      您可以在网络上找到正则表达式示例的音调,只需 google 即可

      【讨论】:

        【解决方案3】:

        您可以使用 Javascript 来做到这一点。问题是需要启用 Javascript 才能发生这种情况,因此您可以想象垃圾邮件机器人在这方面会合作的可能性。

        您将不得不在服务器上将其过滤掉。就我个人而言,我会直接拒绝任何包含链接或电子邮件地址的消息。向用户返回一个错误,但甚至不保存它。

        有关在 PHP 中检测垃圾邮件的一些提示,请阅读 Spam-free accessible forms

        您可能还想考虑使用 CAPTCHA。

        【讨论】:

          【解决方案4】:

          好吧,如果您真的想打击垃圾邮件,请执行以下步骤:

          1. 在表单中放置验证码,这样非人类甚至无法提交表单。一个非常流行的验证码实现是reCAPTCHA

          2. 在字段上做一个strip_tags,这样即使有人手动输入网址,它也会被删除。

          3. 对电子邮件地址进行正则表达式检查并将其删除。从网络上选择一个好的正则表达式,它将选择大多数电子邮件格式。

          希望对您有所帮助。干杯!

          【讨论】:

            【解决方案5】:

            大概,您不想接受任何类型的 HTML,只接受纯文本?在这种情况下,strip_tags 是您的朋友。 strip_tags 还允许您指定一些可接受的标签。

            我也衷心推荐加入header-injection defence script

            【讨论】:

              【解决方案6】:

              伙计们,

              我尝试使用 strip_tags,它肯定会删除标签,但不会删除“mailto:”或“http://”文本,因此链接仍然是链接。

              是否有一个简单的 PHP 命令或例程可以扫描字符串并在字符串的这些部分中将“mailto:”和/或“http://”替换为无害的空字符串“”?

              也尝试过谷歌搜索,但我发现的大部分内容都是关于修剪空白等。

              对不起,我对 PHP 有点陌生。

              感谢和问候,

              托尼

              【讨论】:

              • 应该可以(没有测试)。 $input = preg_replace(array("/mailto:[^]*/i","/http:\/\/[^]*/i"),"",$input);
              【解决方案7】:

              这很简单,但我敢肯定你可以在此基础上构建......

              尝试添加一张猫或狗的图片,然后让他们输入所示动物的三个字母名称......或类似的东西。进行验证检查,然后从那里开始……便宜又简单的验证码。这样只有人工输入才会输出.. .

              【讨论】:

              • 机器人对此有 50/50 的猜测机会。
              • 怎么会......从什么时候开始机器人解释图像?
              【解决方案8】:

              您必须遍历 $_POST 数组中的每个字段(至少是您不希望在其中包含电子邮件或链接的字段)并对照几个正则表达式对其进行检查。

              使用 CAPTCHA 的建议也不错。

              无论如何,这是一个糟糕的检查实现:

              class ValidationHelper
              {
                  // Regex taken from https://github.com/google-code-export/prado3/blob/master/framework/Web/UI/WebControls/TEmailAddressValidator.php
                  const EMAIL_REGEX = "#\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*#";
              
                  // hacked up regex that I just cooked up - could be hugely improved i'm sure.
                  const LINK_REGEX = "#(h\s*t\s*t\s*p\s*s?|f\s*t\s*p)\s*:\s*/\s*/#";
              
                  public static function containsEmail($value)
                  {
                      if (preg_match(self::EMAIL_REGEX, $value))
                          return true;
              
                      return false;
                  }
              
                  public static function containsLink($value)
                  {
                      if (preg_match(self::LINK_REGEX, $value))
                          return true;
              
                      return false;
                  }
              }
              
              $errors = array();
              foreach ($_POST as $key=>$value) {
                  // presumably you want at least one email field, yeah?
                  if ($key != 'email') {
                      // perhaps you should be running strip_tags over everything if you don't want html and such...
                      // see http://php.net/strip_tags for more info. without it (or something similar), there's nothing 
                      // to stop people from putting <script type="text/javascript" src="http://notyourdomain.com/~1337skriptkiddy/haxxors.js"></script>
                      // into your form. even if you might not necessarily ever be displaying this in a scenario
                      // where it can cause trouble, it's never a bad idea to stop this stuff *before* it gets into your db
                      $_POST[$key] = $value = strip_tags($value);
                      if (ValidationHelper::containsEmail($value) || ValidationHelper::containsLink($value))
                          $errors[] = 'Please ensure the value you entered for '.$fieldNames[$key].' does not contain any links or email addresses';
                  }
              }
              
              if (!empty($errors)) {
                  // failed - show errors.
              }
              else {
                  // success!
              }
              

              【讨论】:

              • 为什么要迭代?只需将它们与它们之间的空格连接起来,然后在结果上运行正则表达式...
              • 因为我规定在每个值上运行 strip_tags 以在检查之前对其进行清理。大概之后无论如何都需要对数据进行一些处理(比如将其保存到数据库中),这意味着应该逐个字段地进行清理。我想你可以连接做正则表达式并仍然迭代做消毒,但这对我来说似乎是一个微优化。
              猜你喜欢
              • 1970-01-01
              • 2018-11-17
              • 2012-08-12
              • 2023-04-10
              • 1970-01-01
              • 1970-01-01
              • 2012-01-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多