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

appengine allow only http requests from local application

我想确保我的应用引擎处理程序之一仅在请求源自本地应用程序时才响应。

我查看了 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,就像我将图像提供给普通用户一样,授权代码将阻止对 x[=34 的访问=]2pdf。为了解决这个问题,我实现了第二个图像处理程序,它没有基于用户的安全性。我现在的问题是确保第二个处理程序的安全,以免出现安全漏洞。

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

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

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