【问题标题】:Header Check in Python (GAE)Python 中的标头检查 (GAE)
【发布时间】:2013-01-13 17:13:41
【问题描述】:

我想知道如何检查 HTTP 标头以确定请求是有效的还是格式错误的。如何在 Python 中做到这一点,更具体地说,如何在 GAE 中做到这一点?

【问题讨论】:

  • 您是在谈论对您的应用程序的入站 HTTP 请求的标头吗?我怀疑 GAE 会让带有无效标头的请求到达您的代码。或者,也许,你能澄清一下“格式错误”的标题是什么意思吗?
  • 我需要阻止对我的 GAE 应用程序的传入 DDoS 攻击 (HTTP)。最好的方法是阻止格式错误的标头请求。过去,我曾遭受过 HTTP DDoS 攻击,并成功地最大化了我的 GAE 应用程序的实例小时数/配额。
  • GAE 的应用设置中没有 DDoS 保护吗?
  • 确实如此,但它涉及手动过程。有没有办法自动化这个过程?

标签: python security google-app-engine


【解决方案1】:

对于一些调试和查看带有标头的请求,我使用以下 DDTHandler 类。

import cgi
import wsgiref.handlers
import webapp2

class DDTHandler(webapp2.RequestHandler):

    def __start_display(self):
        self.response.out.write("<!--\n")

    def __end_display(self):
        self.response.out.write("-->\n")

    def __show_dictionary_items(self,dictionary,title):
        if (len(dictionary) > 0):
            request = self.request
            out = self.response.out
            out.write("\n" + title + ":\n")
            for key, value in dictionary.iteritems():
                out.write(key + " = " + value + "\n")

    def __show_request_members(self):
        request = self.request
        out = self.response.out
        out.write(request.url+"\n")
        out.write("Query = "+request.query_string+"\n")
        out.write("Remote = "+request.remote_addr+"\n")
        out.write("Path = "+request.path+"\n\n")
        out.write("Request payload:\n")
        if (len(request.arguments()) > 0): 
            for argument in request.arguments():
                value = cgi.escape(request.get(argument))
                out.write(argument+" = "+value+"\n")
        else:
            out.write("Empty\n")

        self.__show_dictionary_items(request.headers, "Headers")
        self.__show_dictionary_items(request.cookies, "Cookies")

    def view_request(self):
        self.__start_display()
        self.__show_request_members()
        self.__end_display()

    def view(self, aString):
        self.__start_display()
        self.response.out.write(aString+"\n")
        self.__end_display()

例子:

class RootPage(DDTHandler):

    def get(self):      
        self.view_request()

将输出请求并包含标头

所以请检查代码并获得所需的内容。如上所述,格式错误的“无效”请求可​​能不会影响您的应用。

<!--
http://localhost:8081/
Query = 
Remote = 127.0.0.1
Path = /

Request payload:
Empty

Headers:
Referer = http://localhost:8081/_ah/login?continue=http%3A//localhost%3A8081/
Accept-Charset = ISO-8859-7,utf-8;q=0.7,*;q=0.3
Cookie = hl=en_US; dev_appserver_login="test@example.com:False:185804764220139124118"
User-Agent = Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17
Host = localhost:8081
Accept = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language = en-US,en;q=0.8,el;q=0.6

Cookies:
dev_appserver_login = test@example.com:False:185804764220139124118
hl = en_US
-->

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多