Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止Facebook/其他应用通过私有共享链接抓取我的web应用程序_Facebook_Google App Engine_Flask - Fatal编程技术网

停止Facebook/其他应用通过私有共享链接抓取我的web应用程序

停止Facebook/其他应用通过私有共享链接抓取我的web应用程序,facebook,google-app-engine,flask,Facebook,Google App Engine,Flask,编辑:建议的答案不起作用,因为机器人不仅仅是从我的索引中随机爬行,而是在FB消息中输入某个特定链接时访问该链接 我在Flask on App Engine中创建了一个基本的聊天应用程序。它允许用户通过添加他们的ID或给他们一个私人共享链接来邀请其他人,该链接会自动添加曾经访问过它的人(类似于youtube或google drive) 我发现的一个严重缺陷是,如果用户将链接发布到facebook消息中,facebook将抓取/访问该链接,并根据我的系统设计,将他们作为用户添加到对话中。突然,你会看

编辑:建议的答案不起作用,因为机器人不仅仅是从我的索引中随机爬行,而是在FB消息中输入某个特定链接时访问该链接

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

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

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

Facebook机器人访问该链接,获得一个ID,并在对话中获得身份验证,因为他们使用了用户共享链接,我有没有办法通过Flask/Python或App Engine阻止这种情况?我可以禁止使用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

如果Facebook bot:return False,我可能会先加上一个检查。对于你的情况,我想说,你可以在自己或谷歌云平台方面避免这种情况。更准确地说,您可以拒绝代码中的某些连接,也可以为应用程序引擎实例设置防火墙规则以拒绝来自特定IP的连接。在公共文档中,您可以找到有关使用GAE时防火墙规则的更多信息:

  • 使用环境
  • 使用环境
代码方面,您可以在这个github进行检查,它解决了阻止某些IP访问Flask应用程序的问题


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

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

def检查机器人(f):
@包装(f)
def装饰(*args,**kwargs):
如果“非机器人”未在会话中:
agent=request.headers.get('User-agent')
if request.headers.getlist(“X-Forwarded-For”):
ip=request.headers.getlist(“X-Forwarded-For”)[0]
其他:
ip=request.remote\u addr
#共享对话链接时阻止机器人爬行
#也可以使用IPs
如果代理中的“facebook”或代理中的“Slackbot”:
返回“无机器人,谢谢”
#真正的人会来到这里,继续前进
会话['not_a_机器人']=True
返回f(*args,**kwargs)
回报
@应用程序路径(“/”)
@检查机器人的位置
def索引()
返回“你好,人类”
此问题也会出现在任何消息服务中,这些服务会抓取您的链接以在聊天信息中显示数据(WhatsApp、Slack等)


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

@siamsot facebook是否遵守robots.txt?我想是的,这似乎不起作用,我想更多的是为了停止一般的爬行,所以我要用IP禁止来自Facebook的请求。很有趣知道!