template - ¿Cuál es la mejor manera de filtrar las URL para la entrada?
views django example (4)
Tengo un formulario que acepta URL de los usuarios en PHP.
¿Qué personajes debería permitir o rechazar? Actualmente uso
$ input = preg_replace ("/ [^ a-zA-Z0-9 - /?: #. () /, / / & / ''//"] / "," ", $ cadena);
$ input = substr ($ input, 0,255);
Entonces, está recortado a 255 caracteres y solo puede incluir letras, números y? - _: # (), & ''"/
¿Alguna cosa que deba despojarme de lo que no soy, o cualquier cosa que esté pelando que pueda necesitar estar en una URL válida?
Esta es la expresión regular que utilicé en un sitio de clonación TinyUrl que hice:
([a-zA-Z]+://)?([a-z0-9A-Z-]+/.[a-z0-9A-Z/.-]+[a-z0-9A-Z/_?=;%&,+/./-]+)
Necesita permitir = signo y% para cosas como% 20. También el signo @ es legal
Puede validar la URL con una expresión regular como esta
/(ftp|http|https):////(/w+:{0,1}/w*@)?(/S+)(:[0-9]+)?(//|//([/w#!:.?+=&%@!/-//]))?/
Además, no creo que los paréntesis y las citas estén permitidos en las URL tampoco.
RFC 1738 que define la especificación de URL indica que solo los caracteres
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+.-
se puede usar dentro de un esquema URL, y solo los caracteres
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.+!*''(),;/?:@=&
se puede usar sin codificar dentro de la parte específica del esquema de una URL. ( ;/?:@=&
, si se utiliza sin codificar, se debe usar para sus "fines reservados", pero si solo está buscando caracteres no válidos, no tiene que preocuparse por eso). Entonces, si quieres una generalidad completa, verificaría la URL con esta expresión regular:
"/([a-zA-Z+.-]+:////)?([a-zA-Z0-9/$/-_/./+/!/*''/(/),/;///?/:/@/=/&]+)/"
(Probablemente parte de ese escape no es necesario). Si solo busca URL HTTP, (algunas) las demás respuestas deberían estar bien.
Sugeriría que analice el URI de acuerdo con las especificaciones (siendo indulgente con los caracteres ilegales) y luego reconstruirlo estrictamente de acuerdo con las especificaciones ... Lo que parece mucho, pero tengo una ventaja con una clase que escribí y uso para mis propios proyectos
Lo he puesto en pastebin, porque es bastante grande.
Ejemplo:
$uri = new N_Uri(''http://example.com/path/segments/with spaces?key=value''); echo $uri;
Imprime: http://example.com/path/segments/with%20spaces?key=value