GAE:POST OK作为本地HTML文件,但不在GAE SDK或GAE基础结构上

时间:2015-01-09 12:46:57

标签: google-app-engine

我们有一个网站,允许用户使用隐藏的输入进行登录,以便在HTML表单中传递usernamepassword,如下所示(我知道它不安全,但是'我被要求做什么:-()。

<form method="post" action="https://...">
  <input name="username" value="..." type="hidden">
  <input name="password" value="..." type="hidden">
  <input type="submit" value="submit">
</form>

如果HTML文件保存为本地HTML文件,我可以通过提交表单成功登录(浏览器中显示的URL为file:///.../xxx.html)。

但是,如果我使用GAE SDK呈现HTML文件,我无法登录,网站抱怨我尝试通过未知来源登录(浏览器中显示的网址为http://localhost:8080/ )。

如果我将系统部署到GAE基础架构,我也无法登录,使用与上面相同的错误消息(浏览器中显示的URL为http://xxxxx.appspot.com)。

我想知道本地HTML表单和网站呈现表单之间的区别。

如何从网站呈现的表单中启用日志记录?

1 个答案:

答案 0 :(得分:1)

重要的部分是您的浏览器和您正在使用的日志服务之间的最终HTTP通信,表单帖子将转换为最后的。要查看任何差异,您可以使用任何浏览器(Google-&gt; View-&gt;开发者 - &gt;开发人员工具),并在提交表单时查看网络活动。您会注意到从文件发出的POST和由本地或云服务器(如Google SDK或Google App Engine)提供的文件发出的POST之间存在一些差异,我做了一个快速测试,主要区别在于:

从文件发帖时:

产地:空

当从服务器的html POSTING时:

Origin:http://localhost:26124
Referer:http://localhost:26124/testform/

从服务器端的角度来看,您可以设置一个模型POST监听器(我在SDK上做过),这是代码:

class TestFormHandler(BaseHandler):
    def get(self):
        form = """
              <form method="post" action="">
              <input name="username" value="valueusernamme" type="hidden">
              <input name="password" value="valuepassword" type="hidden">
              <input type="submit" value="submit">
              </form>
        """
    self.response.out.write(form)

def post(self):
    logging.info(self.request.body)
    logging.info(self.request.headers)
    logging.info(self.request.params)
    logging.info(self.request.cookies)

然后使用带有表单的文件(确保表单操作是本地或云服务localhost和端口的地址,如果它来自您自己的计算机),或访问您设置的服务(返回的GET处理程序)以前的表格)。

打印出以下形式的正文,标题,参数和饼干后:

使用文件POST:

username=valueusernamme&password=valuepassword

{'X-Appengine-Country': 'ZZ', 'Content-Type': 'application/x-www-form-urlencoded', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'es-419,es;q=0.8,en;q=0.6', 'Content_Length': '46', 'Content-Length': '46', 'Content_Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.69 Safari/537.36', 'Host': 'localhost:26124', 'Origin': 'null', 'Pragma': 'no-cache', 'Cookie': 'dev_appserver_login="test@example.com:True:185804764220139124118"; PHPSESSID=f87c32d417539f8d2903ac76dc5fef1f; language_id=1; __atuvc=0%7C43%2C1%7C44%2C8%7C45%2C0%7C46%2C54%7C47; session=eyJfY3NyZl90b2tlbiI6IjVzcVhEayJ9|1418620181|f01cc7c352763ebe30a0c1d2a34f063112641bbd; _ga=GA1.1.629360734.1406657652; hl=es_ES', 'Cache-Control': 'no-cache'}

UnicodeMultiDict([(u'username', u'valueusernamme'), (u'password', '******')])

UnicodeMultiDict([(u'__atuvc', u'0%7C43%2C1%7C44%2C8%7C45%2C0%7C46%2C54%7C47'), (u'PHPSESSID', u'f87c32d417539f8d2903ac76dc5fef1f'), (u'dev_appserver_login', u'test@example.com:True:185804764220139124118'), (u'session', u'eyJfY3NyZl90b2tlbiI6IjVzcVhEayJ9|1418620181|f01cc7c352763ebe30a0c1d2a34f063112641bbd'), (u'_ga', u'GA1.1.629360734.1406657652'), (u'language_id', u'1'), (u'hl', u'es_ES')])

使用服务器提供的文件:

username=valueusernamme&password=valuepassword

{'X-Appengine-Country': 'ZZ', 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'es-419,es;q=0.8,en;q=0.6', 'Content_Length': '46', 'Content-Length': '46', 'Referer': 'http://localhost:26124/testform/', 'Content_Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.69 Safari/537.36', 'Host': 'localhost:26124', 'Origin': 'http://localhost:26124', 'Pragma': 'no-cache', 'Cookie': 'dev_appserver_login="test@example.com:True:185804764220139124118"; PHPSESSID=f87c32d417539f8d2903ac76dc5fef1f; language_id=1; __atuvc=0%7C43%2C1%7C44%2C8%7C45%2C0%7C46%2C54%7C47; session=eyJfY3NyZl90b2tlbiI6IjVzcVhEayJ9|1418620181|f01cc7c352763ebe30a0c1d2a34f063112641bbd; _ga=GA1.1.629360734.1406657652; hl=es_ES', 'Cache-Control': 'no-cache'}

UnicodeMultiDict([(u'username', u'valueusernamme'), (u'password', '******')])

UnicodeMultiDict([(u'__atuvc', u'0%7C43%2C1%7C44%2C8%7C45%2C0%7C46%2C54%7C47'), (u'PHPSESSID', u'f87c32d417539f8d2903ac76dc5fef1f'), (u'dev_appserver_login', u'test@example.com:True:185804764220139124118'), (u'session', u'eyJfY3NyZl90b2tlbiI6IjVzcVhEayJ9|1418620181|f01cc7c352763ebe30a0c1d2a34f063112641bbd'), (u'_ga', u'GA1.1.629360734.1406657652'), (u'language_id', u'1'), (u'hl', u'es_ES')])

某些服务检查请求的来源并可以使用Origin或Referer过滤访问,我会尝试查看日志服务,以确定他们是否有这方面的内容。