【问题标题】:How to filter out this bot / prevent this "attack"?如何过滤掉这个机器人/防止这种“攻击”?
【发布时间】:2015-07-11 17:35:13
【问题描述】:

在我的 symfony2 应用程序中,几天前我犯了一个错误,在一个特定页面中,未连接的用户可以在表单中发布任何数据而无需任何验证。

我在不到 1 小时的时间内收到了 500 多个不相关内容的条目,现在这个问题已经解决了。

现在,即使恶意软件无法再发布,它仍然会访问这个唯一的页面,每分钟一次。我在同一页面上有一个浏览量,然后它会异常膨胀。

我试图过滤掉机器人,但似乎这个很聪明。我的代码:

public function increaseViewCount(ViewCountInterface $entity, $andFlush = true)
{
    $detector = $this->get('vipx_bot_detect.detector');
    $id = 'viewcount' . get_class($entity) . $entity->getId();

    if
    (
        (empty($_SERVER['HTTP_USER_AGENT']) || !preg_match('~(bot|crawl|slurp|spider)~i', $_SERVER['HTTP_USER_AGENT']))
        && strstr($this->get('request')->headers->get('referer'), 'foodmeup')
        && $detector->detectFromRequest($this->container->get('request')) === null
        && $this->get('session')->get($id) == false
    )
    {
        $entity->increaseCount();
        $this->persist($entity);
        if ($andFlush) $this->flush($entity);
        $this->get('journal_manager')->addJournalEntry('view', array(
                'HTTP_USER_AGENT' => $_SERVER['HTTP_USER_AGENT'],
                'REMOTE_ADDR' => $_SERVER['REMOTE_ADDR'],
                'time' => time(),
                'date' => date("d/m/Y H:i:s"),
                'referer' => $this->get('request')->headers->get('referer')
            ), $entity->getId(), get_class($entity));
        $this->get('session')->set($id, true);
    }

    return $this;
}

但是(如您所见,我记录了条目)我得到的结果如下:用户代理不包含任何机器人名称。

Paramètre   Valeur
HTTP_USER_AGENT Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12521 Safari/537.36
REMOTE_ADDR 91.200.12.7
time    1430510089
date    01/05/2015 21:54:49
referer mywebsite/permettre-de-suggerer-une-photo-sur-les-elements-qui-n-en-ont-pas

所以我有它的 IP,我发现最后一小时的最后 100 次访问都来自乌克兰的某个地方。

不过,当我检查我的 googleAnalytics 帐户时,并没有这些访问的痕迹。​​

  • 那么我该如何解决这个问题呢?
    • 实施 javascript viewcount 是最安全的方法吗?
    • 我还没有设置机器人陷阱,但是这里的 IP 每次都会改变,所以我不确定它是否能在这种情况下工作。
    • 我可以检索哪些其他数据来更好地了解如何解决这个问题?

【问题讨论】:

  • 这个机器人是你的用户代理日志中的唯一实例吗?如果是这样,只需通过 UA 阻止 - 使用所有这些版本号,其他人不太可能使用它。 This is also of interest.
  • 嗯,确实,UA 在东欧使用。我没有看到我的目标之一拥有它的理由,所以我会阻止 YaBrowser,谢谢!
  • 没有问题。我想知道 GA 是否因为它需要 JavaScript 而没有注册命中,但该机器人是基于 cURL 的并且没有 JS 引擎。

标签: php symfony web-crawler user-agent bots


【解决方案1】:

在您的 Apache 配置中添加拒绝 - 这可能会:

Deny from 91.0.0.0/8

http://httpd.apache.org/docs/2.2/howto/access.html#host

谨慎使用 - 因为它会阻止来自该 IP CIDR 块的所有请求。 http://whois.arin.net/rest/net/NET-91-0-0-0-1/pft

【讨论】:

  • 不幸的是,每个日志条目的 IP 都不一样,这在这里不起作用...我猜那些是僵尸计算机
  • 这将阻止来自整个 CIDR 块的所有请求 - 所有请求都来自以 91 开头的 IP 地址吗?
  • 它们都以 91 开头。什么是 CIDR 块?这就是结尾/8的意思吗?
  • CIDR 块可让您识别一组 IP 地址。我选择了 91.0.0.0/8,通过使用 whois 链接查找块中具有您引用的 IP 地址的所有 IP 地址。 en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
【解决方案2】:

唯一正确的方法是清理服务器端的所有输入,就像您最终所做的那样。阻止 /8 IP 范围是如此无情,我什至无法开始描述这是多大的弊端。 如果我要建议一种真正冗余的方法来保护它,那将是一个反向代理服务器。这将对以预期方式加载文件的用户进行一些基本的浏览模式分析并解锁发布。如果更高级,它还可以随机化您的服务器期望的 POST 字段名称,但我想这会在这一点上锦上添花。

【讨论】:

    猜你喜欢
    • 2014-02-06
    • 2021-06-26
    • 2021-08-09
    • 2017-10-11
    • 2021-05-01
    • 2020-08-07
    • 2017-04-10
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多