验证HTTP请求的来源

2024-06-07 14:37:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

System A,在googleappengine(GAE)上运行Django(python2.5)

System B,通过Lighttpd在Ubuntu/Linux上运行Django(python2.6)(稍后可能是nginx)

系统A将使用Url Fetch定期对系统B发出请求(“请求”)。在

System B有一个Django应用程序设置,可以使用urls.py来监听这些请求,如下所示:

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

以及相应的views.py类似于:

^{pr2}$

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

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

  • IP地址可能是伪造的(我可能不知道是怎么改的)
  • 检查IP的反向DNS是否来自GAE(但是我不知道GAE的DNS条目是什么,如果它们会更改,它们可能会被欺骗)
  • 使用来自SystemA的TLS客户端证书-但我不知道如何使用GAE
  • 根据共享的内容(如salt)与pycrypto进行挑战/响应

理想情况下,我希望以views.py的方式结束:

... 
from django.http import HttpResponseForbidden 

def requisition(request):
   " do something "
  if not verify_request_origin():
     return HttpResponseForbidden("Denied.")

  response = HttpResponse()
  ...

其中,当对System B的请求来自GAE上的System A时,verify_request_origin()返回true。在

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


Tags: djangopydnsrequestubuntu系统originsystem
3条回答

你说得对,前两个要点没用。在

Andrew所说的密码就足够了,除非您担心浏览器缓存的问题。如果您是,那么您应该仍然使用SSL,但是通过例如hmac对一个应用程序进行身份验证,并使用它为会话生成共享机密。秘密应该存在于代码中,而不是传输的数据中。在

系统A可以通过urlfetch.fetch发送HTTPS请求——只要URL参数以https://开头。但是,这并不能对systemb进行身份验证(它确实可以防止嗅探器和中间人攻击);无法使用客户端TLS证书。在

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

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

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

SSL将嗅探器拒之门外,而且您不会在您控制的系统之外泄露查询,所以共享秘密就可以了(而且比IP跟踪更安全,因为其他GAE站点将使用这些地址)。在

相关问题 更多 >

    热门问题