1

伙计们,

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

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

谢谢并恭祝安康,

托尼

4

8 回答 8

6

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

于 2009-05-10T00:52:01.680 回答
0

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

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

有关在 PHP 中检测垃圾邮件的一些技巧,请阅读无垃圾邮件的可访问表单

您可能还想考虑使用 CAPTCHA。

于 2009-05-10T00:52:17.217 回答
0

这是非常简单的,但你可以建立在它之上,我敢肯定......

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

于 2009-05-11T22:52:30.577 回答
0

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

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

于 2009-05-10T00:51:16.283 回答
0

您必须遍历 $_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!
}
于 2009-05-10T02:26:35.227 回答
0

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

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

  2. 在字段上做一个strip_tags,这样即使有人手动放置 URL,它也会被删除。

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

希望这有帮助。干杯!

于 2009-05-10T05:12:59.260 回答
0

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

我还衷心推荐合并一个标头注入防御脚本

于 2009-05-10T05:22:42.980 回答
0

伙计们,

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

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

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

抱歉,我对 PHP 有点陌生。

谢谢并恭祝安康,

托尼

于 2009-05-10T14:38:55.780 回答