web-dev-qa-db-ja.com

python)の別のURLにリクエストを転送するにはどうすればよいですか?

XSSテストを行うために特別なURLをリモートサーバーにリダイレクトする構文を探していました。何か案は?

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()
19
tax

リダイレクトの場合、コード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()
20
Dan Andreatta

これは、リダイレクトしてこのファイルを保存し、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()
8
Cody

Python 3

python3他の回答と非常によく似ていますが、デモンストレーションを正当化するのに十分な違いがあります。

これは、引数1として渡されたポートをリッスンし、引数2として渡されたURLに302( "Found"別名Temporary)リダイレクトを送信するだけのスクリプトです。 (そして、使用法のメッセージがあります。)

#!/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/

その例は、あなたが必要とするどんな種類の関数でも書くのに十分なものになるはずです。

6
Bruno Bronosky

HTTPステータスコード301は、リクエストが永続的に移動されることを意味し、レスポンスヘッダーフィールドの場所に設定されている推奨URIにリダイレクトする必要があります。ただし、リダイレクトはブラウザの実装によって異なります。

301の代わりに、303を返すと、要求に対する応答が他のURIで見つかることをブラウザーに通知し、ブラウザーを効果的に管理してGET要求を別のURIにリダイレクトします。ヘンス、303はより良いオプションです。

1
Lyle

他のタイプのリクエスト(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.send_response(307)
        self.send_header('Location','http://www.example.com')
        self.end_headers()

:ステータスコード307の使用は 潜在的に安全ではない であるため、すべての着信リクエストにこのステータスコードを使用することはできません推奨。理想的には、安全であることがわかっているリクエストに対してのみ使用を制限する必要があります

1