验证HTTP请求的来源

Bri*_*unt 5 python encryption django google-app-engine cryptography

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

System A,在Google App Engine(GAE)上运行Django(Python 2.5)

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

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

系统B具有Django应用程序设置,可通过侦听这些请求,urls.py例如:

urlpatterns = patterns('producer.views',
    url(r'^requisition$', 'requisition', name='requisition'),
)
Run Code Online (Sandbox Code Playgroud)

和一个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
Run Code Online (Sandbox Code Playgroud)

如果系统B仅对系统A的请求做出响应,那么这将是对系统安全性的宝贵补充。

我想知道系统B提供哪些选项来验证请求是否来自系统A。我考虑了以下问题:

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

理想情况下,我想以一个views.py类似这样的结尾:

... 
from django.http import HttpResponseForbidden 

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

  response = HttpResponse()
  ...
Run Code Online (Sandbox Code Playgroud)

当发出的请求System B来自System AGAE 时,verify_request_origin()返回true 。

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

Vin*_*vic 1

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

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