代码之家  ›  专栏  ›  技术社区  ›  Brian M. Hunt

验证HTTP请求的源

  •  4
  • Brian M. Hunt  · 技术社区  · 15 年前

    我有两个系统需要通话。系统设置如下:

    System A ,在Google应用引擎(GAE)上运行django(python 2.5)

    System B ,通过lighttpd在Ubuntu/Linux上运行django(python 2.6)(可能是nginx,稍后)

    系统A将定期使用 Url Fetch .

    系统B有一个Django应用程序设置,通过 urls.py 比如:

    urlpatterns = patterns('producer.views',
        url(r'^requisition$', 'requisition', name='requisition'),
    )
    

    和相应的 views.py 比如:

    import json
    from django.http import HttpResponse
    
    def requisition(request):
        " do something "
        response = HttpResponse()
        response['Content-type'] = 'application/json'
        response.write(json.dumps(...))
        return response
    

    如果系统B只响应系统A的请求,这将是对系统安全性的一个有价值的补充。

    我想知道系统B可以使用哪些选项来验证请求是否来自系统A。我考虑了以下事项:

    • 检查IP地址是否来自GAE(但是我不知道GAE IP地址,它们可能会更改,并且可能被欺骗)
    • 检查IP的反向DNS是否来自GAE(但是我不知道GAE的DNS条目是什么,如果它们会更改,那么它们可能会被欺骗)
    • 使用来自系统A的TLS客户端证书-但我不知道如何使用GAE执行此操作
    • 根据共享的内容(如盐)进行挑战/响应 pycrypto

    理想情况下,我想以 VIEW 比如说:

    ... 
    from django.http import HttpResponseForbidden 
    
    def requisition(request):
       " do something "
      if not verify_request_origin():
         return HttpResponseForbidden("Denied.")
    
      response = HttpResponse()
      ...
    

    其中verify_request_origin()在向 系统B 来自于 系统A 在盖伊。

    谢谢你,我期待听到你的想法。

    4 回复  |  直到 12 年前
        1
  •  1
  •   Community CDub    8 年前

    你很在行,前两个要点没用。

    密码为 Andrew 说的足够好,除非你担心浏览器缓存的问题。如果是,那么您应该仍然使用ssl,但要通过例如, hmac ,并使用它为会话生成共享机密。秘密应该存在于代码中,而不是传输的数据中。

        2
  •  2
  •   Andrew Aylett    15 年前

    听起来,在链接上使用SSL并在查询字符串中包含密码就足够了。

    SSL将嗅探器拒之门外,并且您不会泄露您控制下的系统外部的查询,因此共享机密将起作用(并且比IP跟踪更安全,因为其他GAE站点将使用这些地址)。

        3
  •  1
  •   Alex Martelli    15 年前

    系统A可以通过 urlfetch.fetch --只是让url参数以开头 https:// . 但是,这并不能将其认证到系统B(它可以防止嗅探器和中间人攻击);无法使用客户机TLS证书。

    验证请求是否来自GAE(这将是完全可行的:只需在8.8.8.8上使用谷歌自己的DNS服务器——如果有人成功地对谷歌自己的DNS进行了加密,他们欺骗系统B的能力将是全世界最不担心的事;-)也没有任何帮助,原因相同:可能是 任何 GAE应用程序(它们都共享一组IP地址,并且一个给定的IP地址可以在短时间内被任意数量的GAE应用程序使用)。

    因此,考虑到GAE的局限性,用共享秘密加密有效载荷似乎是最简单的。 PyCrypto --也许 exPyCrypto 在前面——可能很好;或者,你可能想尝试一下 SlowAES (当然,对于后者,我有一个弱点;-)。

        4
  •  1
  •   vivekv    12 年前