【问题标题】:Stop Facebook/Other Apps from crawling my web application via private sharelink阻止 Facebook/其他应用程序通过私有共享链接抓取我的网络应用程序
【发布时间】:2019-12-21 21:57:03
【问题描述】:

编辑:建议的答案不起作用,因为机器人不只是从我的索引中随机爬取,当它在 FB 消息中输入时,它们正在访问特定链接。

我在 App Engine 上的 Flask 中创建了一个基本的聊天应用程序。它允许用户通过添加他们的 ID 或通过给他们一个私人共享链接来邀请其他人,该链接会自动添加访问过它的人(类似于 youtube 或 google drive)。

我发现的一个严重缺陷是,如果用户将链接发布到 Facebook 消息中,Facebook 将抓取/访问该链接,并根据我的系统设计将他们作为用户添加到对话中。突然间,您会看到 3 个随机用户加入对话。

我的聊天系统是完全匿名的,并且是临时设计的,因此除了保存在会话中的每个用户的唯一密钥之外,没有登录或身份验证。

因此,Facebook 机器人访问该链接,分配一个 ID 并在对话中进行身份验证,因为他们使用了用户共享链接,有没有办法通过 Flask/Python 或 App Engine 阻止这种情况?我可以 IP 禁止 Facebook 吗?

为了代码而编写一些代码,为每个新访问者执行此操作:

def requires_session(f):
  @wraps(f)
  def decorated(*args, **kwargs):
    if 'profile' not in session:
        user_ref = fs_database.collection('users').document()

        data = {
            'id': user_ref.id,
            'date': datetime.now(timezone.utc)
        }
        # add the user to the database
        user_ref.set(data)

        # save their id to their session
        session['profile'] = data.get('id')

        # create a hash for later on to create a sharelink
        session['share'] = hashlib.sha256(data.get('id').encode('utf-8')).hexdigest()
    return f(*args, **kwargs)
  return decorated

我可以先添加一张支票if Facebook-bot: return False

【问题讨论】:

  • @siamsot facebook 是否遵守 robots.txt?
  • 我希望是的
  • 似乎没有用,我认为它更多是为了停止一般抓取,所以我将使用来自 Facebook 的 IP 禁止请求。
  • 有兴趣知道!

标签: facebook google-app-engine flask


【解决方案1】:

接受的答案将我引向这个答案,我使用装饰器保护了路由,该装饰器将获取传入连接的“用户代理”并查看它的来源。如果它来自 Facebook,请将其重定向。

def check_for_robot(f):
  @wraps(f)
  def decorated(*args, **kwargs):
    if 'not_a_robot' not in session:

        agent = request.headers.get('User-Agent')

        if request.headers.getlist("X-Forwarded-For"):
            ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            ip = request.remote_addr

        # Stop robots from crawling when sharing conversation links
        # Could use the IPs too
        if 'facebook' in agent or 'Slackbot' in agent:
            return 'No Robots Thanks'

        # Real people will get to here and continue on
        session['not_a_robot'] = True
    return f(*args, **kwargs)
  return decorated

@app.route('/')
@check_for_robot
def index()
    return 'hello human'

任何会抓取您的链接以在聊天消息中显示数据的消息服务(WhatsApp、Slack 等)也会出现此问题。

这也暴露了这些消息服务中的一个漏洞,因为它们现在将不正确的元数据返回给聊天服务,但嵌入了您提供的链接,即。网络钓鱼、点击劫持

【讨论】:

    【解决方案2】:

    对于您的情况,我会说您可以在您自己或 Google Cloud Platform 方面避免这种情况。更准确地说,您可以在代码中拒绝某些连接,或者您可以为 App Engine 实例设置防火墙规则以拒绝来自某些 IP 的连接。在公共文档中,您可以找到有关使用 GAE 时的防火墙规则的更多信息:

    代码方面,您可以查看这个 github repo,它解决了阻止某些 IP 访问您的 Flask 应用程序的问题。

    最后一个可能的选项是身份验证,但由于聊天是匿名的,我想这不是您正在寻找的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多