enviar - formularios web python
¿Cómo reenvío una solicitud a una URL diferente en Python? (5)
Python 3
En python3
se hace muy similar a otras respuestas, pero lo suficientemente diferente como para justificar la demostración.
Este es un script que no hace más que escuchar en el puerto pasado como argumento 1 y enviar un redireccionamiento 302 ("Encontrado", también llamado Temporal) a la URL pasada como argumento 2 . (Y tiene un mensaje de uso.)
#!/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()
Lo llamas como
sudo ./redirect.py 80 http://jenkins.example.com:8080/
Ese ejemplo debería proporcionarle lo suficiente para escribir cualquier tipo de función que necesite.
He estado buscando la sintaxis para redirigir una URL especial a un servidor remoto para realizar algunas pruebas de XSS. ¿Algunas ideas?
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()
El código de estado HTTP 301 tiene el significado de que la solicitud se movió permanentemente y se debe redirigir a la URI sugerida, que se establece en el campo del encabezado de respuesta, ubicación. Sin embargo, la redirección ocurre dependiendo de la implementación de los navegadores.
En lugar de 301, devolviendo 303 le dice al navegador que la respuesta para la solicitud se puede encontrar en otro URI y administra efectivamente el navegador para redireccionar la solicitud GET a otro URI. Hense, 303 es una mejor opción.
Este es un fragmento completo de código para redirigir, guardar este archivo y ejecutarlo como un programa de Python. para terminar, 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()
Para una redirección, debe devolver un código 301, más un encabezado de Location
. Probablemente puedas probar algo como:
class myHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(301)
self.send_header(''Location'',''http://www.example.com'')
self.end_headers()
Si está intentando redirigir otros tipos de solicitudes (por ejemplo, POST), es posible que deba usar el código de estado 307
lugar de 301
.
-
301
se redireccionará con una solicitud GET incluso si envió una solicitud POST -
307
utilizará el mismo método que usó para la solicitud inicial
Código de ejemplo que redirige las solicitudes GET y 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()
Nota : el uso del código de estado 307
es potencialmente peligroso , por lo que no se recomienda usar este código de estado para todas las solicitudes entrantes. Idealmente, desearía restringir su uso solo para solicitudes que sepa que son seguras .