我有两个系统需要谈谈。系统设置如下:
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
类似于:
如果系统B只响应来自系统a的请求,这将是对系统安全性的一个有价值的补充
我想知道系统B有哪些选项可以用来验证请求是否来自系统A。我考虑了以下几点:
理想情况下,我希望以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。在
谢谢你,我期待听到你的想法。在
你说得对,前两个要点没用。在
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站点将使用这些地址)。在
相关问题 更多 >
编程相关推荐