25

我一直在寻找将特殊 url 重定向到远程服务器以进行 XSS 测试的语法。有任何想法吗?

import SimpleHTTPServer
import SocketServer

class myHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        print self.path 
        if self.path == '/analog':
-------------------->return "http://12b.dk/analog"???
        return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

theport = 1234
Handler = myHandler
pywebserver = SocketServer.TCPServer(("", theport), Handler)

print "Python based web server. Serving at port", theport
pywebserver.serve_forever()
4

5 回答 5

26

对于重定向,您必须返回代码 301 和Location标头。可能您可以尝试以下方法:

class myHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
   def do_GET(self):
       self.send_response(301)
       self.send_header('Location','http://www.example.com')
       self.end_headers()
于 2010-03-24T10:57:21.707 回答
20

蟒蛇 3

它的完成方式与python3其他答案非常相似,但差异足以证明演示的合理性。

这是一个脚本,除了侦听作为参数 1传递的端口并将 302(“找到”又名临时)重定向到作为参数 2传递的 URL之外什么都不做。(并且它有一个使用信息。)

#!/usr/bin/env python3

import sys
from http.server import HTTPServer, BaseHTTPRequestHandler

if len(sys.argv)-1 != 2:
    print("""
Usage: {} <port_number> <url>
    """.format(sys.argv[0]))
    sys.exit()

class Redirect(BaseHTTPRequestHandler):
   def do_GET(self):
       self.send_response(302)
       self.send_header('Location', sys.argv[2])
       self.end_headers()

HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()

你这样称呼它:

sudo ./redirect.py 80 http://jenkins.example.com:8080/

该示例应该足以让您编写所需的任何类型的功能。

于 2017-11-02T20:39:27.203 回答
7

这是用于重定向、保存此文件并将其作为 python 程序运行的完整代码。终止, ctrl + c。

import SimpleHTTPServer
import SocketServer
class myHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
   def do_GET(self):
       print self.path
       self.send_response(301)
       new_path = '%s%s'%('http://newserver.com', self.path)
       self.send_header('Location', new_path)
       self.end_headers()

PORT = 8000
handler = SocketServer.TCPServer(("", PORT), myHandler)
print "serving at port 8000"
handler.serve_forever()
于 2014-03-04T20:08:18.980 回答
5

如果您尝试重定向其他类型的请求(例如 POST),您可能需要使用状态码307而不是301.

  • 301即使您发送了 POST 请求,也会使用 GET 请求重定向
  • 307将使用与初始请求相同的方法

重定向 GET 和 POST 请求的示例代码:

class myHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.redirect()
    def do_POST(self):
        self.redirect()
    def redirect(self):
        self.send_response(307)
        self.send_header('Location','http://www.example.com')
        self.end_headers()

注意:使用状态码可能307不安全的,因此不建议对所有传入请求使用此状态码。理想情况下,您希望仅将其用于您知道是安全的请求。

于 2018-05-30T15:01:45.880 回答
1

HTTP 状态代码 301 具有永久移动请求的含义,应重定向到设置为响应头字段位置的建议 URI。但是,重定向的发生取决于浏览器的实现。

代替 301,返回 303 告诉浏览器可以在其他 URI 下找到请求的响应,并有效地管理浏览器将 GET 请求重定向到另一个 URI。Hense,303是更好的选择。

于 2014-11-07T08:29:49.323 回答