Python 验证HTTP请求的源

Python 验证HTTP请求的源,python,django,google-app-engine,encryption,cryptography,Python,Django,Google App Engine,Encryption,Cryptography,我有两个系统需要谈谈。系统的设置如下: 系统A,在谷歌应用程序引擎(GAE)上运行Django(Python 2.5) 系统B,在Ubuntu/Linux上通过Lighttpd运行Django(Python 2.6)(可能是nginx,更高版本) 系统A将定期使用向系统B发出请求(“请购单”) System B有一个Django应用程序设置,可以通过urls.py监听这些请求,类似于: urlpatterns = patterns('producer.views', url(r'^req

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

系统A
,在谷歌应用程序引擎(GAE)上运行Django(Python 2.5)

系统B
,在Ubuntu/Linux上通过Lighttpd运行Django(Python 2.6)(可能是nginx,更高版本)

系统A将定期使用向系统B发出请求(“请购单”)

System B有一个Django应用程序设置,可以通过
urls.py
监听这些请求,类似于:

urlpatterns = patterns('producer.views',
    url(r'^requisition$', 'requisition', name='requisition'),
)
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
和相应的
views.py
,类似于:

urlpatterns = patterns('producer.views',
    url(r'^requisition$', 'requisition', name='requisition'),
)
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实现这一点
  • 根据共享的内容(如盐)进行挑战/响应
理想情况下,我希望最终得到一个
views.py
和如下内容:

... 
from django.http import HttpResponseForbidden 

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

  response = HttpResponse()
  ...
其中,当向
系统B
发出的请求来自GAE上的
系统A
时,verify_request_origin()返回true


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

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


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

您很清楚,前两个要点没有用


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

系统A可以通过发送HTTPS请求——只需让URL参数以
HTTPS://
开头即可。但是,这不会向系统B进行身份验证(它可以防止嗅探器和中间人攻击);无法使用客户端TLS证书

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


因此,考虑到GAE的局限性,使用共享秘密加密有效负载似乎是最简单的。--可能是前面的-,可能是好的;或者,您可能想尝试一下(当然,我对后者有一个弱点;-).

一个防弹选项是查看FOAF+SSL

无需加密有效负载-事实上,在没有HMAC的情况下这样做并不能保证完整性。简单地应用HMAC是最简单的方法。我不确定我是否理解最后一条评论。你说的秘密应该存在于代码中而不是传输中是什么意思加密数据?你是说共享密钥吗?