appengine仅允许来自本地应用程序的http请求

时间:2015-04-15 03:23:47

标签: python google-app-engine pdf webapp2

我想确保我的一个appengine处理程序仅在请求来自本地应用程序时才响应。

我查看了handler.request.environ,这是我发现的(我修改了application_id):

{
    'USER_ORGANIZATION': '',
    'TZ': 'UTC',
    'APPLICATION_ID': 'dev~myappid',
    'USER_NICKNAME': '',
    'REMOTE_ADDR': '127.0.0.1',
    'DEFAULT_VERSION_HOSTNAME': 'localhost:8080',
    'CURRENT_MODULE_ID': 'default',
    'wsgi.multithread': True,
    'REQUEST_METHOD': 'GET',
    'DATACENTER': 'us1',
    'wsgi.run_once': False, 
    'REQUEST_ID_HASH': '364BD75E', 
    'QUERY_STRING': '', 
    'USER_IS_ADMIN': '0', 
    'SERVER_SOFTWARE': 'Development/2.0', 
    'REQUEST_LOG_ID': '21f8fe9ca3baeebdacc5dd74febb7aec00a6d6bedbc8dc01415c58393ee7a2cedd155b81e75db18961c98b8ee8cb5dd42', 
    'PATH_TRANSLATED': '/Users/hamish/dev/kp3/src/kp3/main.pyc', 
    'SERVER_NAME': 'localhost', 
    'SERVER_PROTOCOL': 'HTTP/1.1', 
    'AUTH_DOMAIN': 'gmail.com', 
    'SCRIPT_NAME': '', 
    'HTTP_USER_AGENT': 'Python-urllib/2.7 AppEngine-Google; (+http://code.google.com/appengine)', 
    'PATH_INFO': '/spike/two/', 
    'wsgi.multiprocess': True, 
    'HTTP_HOST': 'localhost:8080', 
    'HTTPS': 'off', 
    'INSTANCE_ID': 'fd45d3ed33f7f9abb3bec923ede309eeb3b5', 
    'wsgi.version': (1, 0), 
    'wsgi.input': <_io.BytesIO object at 0x1055294d0>, 
    'SERVER_PORT': '8080', 
    'USER_EMAIL': '', 
    'APPENGINE_RUNTIME': 
    'python27', 
    'CURRENT_VERSION_ID': '1.699634115210300890', 
    'HTTP_X_APPENGINE_COUNTRY': 'ZZ', 
    'USER_ID': '', 
    'webob._cache_control': ('', <CacheControl ''>), 
    'wsgi.url_scheme': 'http'
}

如果请求源自当前的应用程序,那么这里是否有任何内容(或请求处理程序中的其他位置)可以让我确定(即攻击者无法伪造的东西)。

为什么这样做?

我有一个应用程序,可以在blob存储区中存储图像,然后让已批准的用户查看它们。我没有使用blobstore图像托管功能,我正在获取请求,检查登录用户是否有权查看图片,获取blob并返回它。这很好。

我现在想要生成包含其中一些图像的PDF。我目前打算这样做是为了创建一些xhtml,包括对图像的引用,然后使用xhtml2pdf来创建pdf。然后我将存储它并使用相同的安全规则来控制对pdf的访问作为图像。

xhtml2pdf获取图像并将其嵌入pdf文件中。

如果我使用相同的url将图像提供给xhtml2pdf,因为我用它来向普通用户提供这些图像,授权代码会阻止访问xhtml2pdf。为了解决这个问题,我实现了第二个没有基于用户安全性的图像处理程序。我现在的问题是为了没有安全漏洞来保护第二个处理程序。

我试图用来解决这个问题的另一种方法是使用数据URI方案将图像数据直接嵌入到html中,但是我也遇到了错误:

IOError: cannot identify image file fileName=<StringIO.StringIO
instance at 0x10503ca70>

1 个答案:

答案 0 :(得分:1)

如果您不使用自定义域,则可以use this。 X-Appengine-Inbound-Appid只能在内部设置,因此可以安全地用作安全检查。