Publicado el 11 de Julio del 2017
2.342 visualizaciones desde el 11 de Julio del 2017
895,0 KB
33 paginas
Creado hace 10a (28/04/2014)
THE ORIGINAL HACKER
SOFTWARE LIBRE, HACKING y PROGRAMA-
CIÓN, EN UN PROYECTO DE
EUGENIA BAHIT
@eugeniabahit
GLAMP HACKER Y
PROGRAMADORA EXTREMA
HACKER ESPECIALIZADA EN PROGRAMACIÓN
EXTREMA E INGENIERÍA INVERSA DE CÓDIGO
SOBRE GNU/LINUX, APACHE, MYSQL,
PYTHON Y PHP. EUGENIABAHIT.COM
DOCENTE E INSTRUCTORA DE TECNOLOGÍAS
GLAMP CURSOS.EUGENIABAHIT.COM
CURSOSDEPROGRAMACIONADISTANCIA.COM
MIEMBRO DE LA FREE SOFTWARE
FOUNDATION FSF.ORG, THE LINUX
FOUNDATION LINUXFOUNDATION.ORG E
INTEGRANTE DEL EQUIPO DE DEBIAN
HACKERS DEBIANHACKERS.NET.
CREADORA DE PYTHON-PRINTR, EUROPIO
ENGINE, JACKTHESTRIPPER. VIM CONTRI-
BUTOR. FUNDADORA DE HACKERS N'
DEVELOPERS MAGAZINE Y RESPONSABLE
EDITORIAL HASTA OCTUBRE '13.
Buenos Aires, 29 de Abril
de 2014
ÍNDICE DE LA
EDICIÓN NRO5
INGENIERÍA DE SOFTWARE: MANIPULACIÓN DE WEB
FORMS Y CARGA DE ARCHIVOS CON PYTHON Y WSGI
SBRE APACHE..................................3
EUROPIO ENGINE LAB: DICT OBJECT, UN NUEVO
CONCEPTO EN OBJETOS PARA LAS VISTAS EN PHP. 16
SEGURIDAD INFORMÁTICA: MODELOS DE SEGURIDAD
PERMISIVOS COMO MECANISMOS DE PREVENCIÓN DE
VULNERABILIDADES.............................20
BASH SCRIPTING AVANZADO: DIVERSAS FORMAS DE
IMPLEMENTACIÓN DE MENÚS DINÁMICOS............28
The Original Hacker – www.originalhacker.org
®2013, 2014 Eugenia Bahit – www.eugeniabahit.com – Bajo Licencia Creative Commons BY-NC-SA
3
INGENIERÍA DE SOFTWARE:
MANIPULACIÓN DE WEB
FORMS Y CARGA DE
ARCHIVOS CON PYTHON Y
WSGI SBRE APACHE
TRABAJAR CON FORMULARIOS
HTML DESDE PYTHON Y
SOBRE TODO, MANEJAR LA
CARGA DE ARCHIVOS, ES
UNA DE LAS TAREAS MENOS
SENCILLAS A LA HORA DE
CREAR APLICACIONES WEB
SIN UTILIZAR FRAMEWORKS.
SIN EMBARGO, QUE NO SEA
LA MÁS SENCILLA NO
SIGNIFICA QUE SEA
IMPOSIBLE.
D
esde que Python comenzó a implementarse en el diseño
frameworks como Django o
de aplicaciones Web,
Web2Py han parecido ser la única alternativa posible
para desarrollar Software accesible mediante un navegador.
El auge de estos frameworks y por sobre todo, la gran publicidad
que los programadores menos experimentados en la Ingeniería de
Software basado en Web le han hecho a Django, lograron acercar a
miles de de usuarios que sin conocimientos de programación en
Python, podían desarrollar aplicaciones Web con tan solo aprender
a usar el framework.
Sabemos que la humanidad se mueve a base de abusos de
todo tipo y la Ingeniería de Software, no es ajena a ello. Tanto es así
que los usuarios que desarrollan aplicaciones Web utilizando
Django, desconocen por completo el lenguaje y carecen de
nociones básicas de programación, a un punto tal que en mucho
casos, se llega a creer imposible que puedan desarrollarse
aplicaciones Web en Python sin el uso de frameworks.
Hace un tiempo publiqué un paper en Debian Hackers1, sobre cómo crear un sitio Web en Python bajo
Apache sin utilizar frameworks2. Este artículo pretende continuar esta idea, otorgando al lector las
herramientas necesarias para manipular todo tipo de formularios Web incluyendo la carga de archivos al
servidor. Toda esta información puede complementarse con el material3 del curso de Desarrollo de
Aplicaciones Web con Python y MySQL que dicté durante 2012 y 2013 en cursos.eugeniabahit.com
1 www.debianhackers.net
2
3
http://www.debianhackers.net/una-web-en-python-sobre-apache-sin-frameworks-y-en-solo-3-pasos
http://www.cursosdeprogramacionadistancia.com/static/pdf/material-sin-personalizar-python.pdf
The Original Hacker – www.originalhacker.org
®2013, 2014 Eugenia Bahit – www.eugeniabahit.com – Bajo Licencia Creative Commons BY-NC-SA
4
DECLARANDO EL ENCTYPE CORRECTO
En los formularios HTML, el atributo enctype se define cuando el método ha sido establecido como POST y su
finalidad es la de indicar en qué forma serán codificados los datos al enviarse el formulario.
<form id='something' method='post' action='/some/file' enctype='multipart/form-data'>
</form>
El atributo enctype puede tener 3 valores diferentes:
multipart/form-data
Codificación:
ninguna (los caracteres son enviados tal cual están, sin codificación previa)
Uso:
recomendado para manipular la carga de archivos
Delimitador de campos:
aleatorio (se obtiene mediante la clave CONTENT-TYPE del diccionario environ)
delimitador = environ['CONTENT-TYPE'].replace('multipart/form-data; boundary=', '')
# retornará algo como: -----------------------------17553758491697998425554867382
Formato recepción de datos:
Ejemplo para un formulario con dos campos de textos (nombre y edad)
-----------------------------17553758491697998425554867382
Content-Disposition: form-data; name="nombre"
Juan Pérez
-----------------------------17553758491697998425554867382
Content-Disposition: form-data; name="edad"
90
-----------------------------17553758491697998425554867382--
application/x-www-form-urlencoded
Codificación:
ASCII Hexadecimal. Los espacios en blanco se reemplazan por el signo +
Uso:
es el valor por defecto de todo formulario. Se recomienda para todos los formularios que no requieran
manipular la carga de archivos.
The Original Hacker – www.originalhacker.org
®2013, 2014 Eugenia Bahit – www.eugeniabahit.com – Bajo Licencia Creative Commons BY-NC-SA
5
Delimitador de campos:
Signo &
Formato recepción de datos:
Ejemplo para un formulario con dos campos de textos (nombre y edad)
nombre=Juan+P%C3%A9rez&edad=90
Notar que la vocal “e” acentuada ha sido codificada como %C3% mientras que el espacio en blanco fue sustituido por el signo +
text/plain
Codificación:
ninguna (los caracteres son enviados tal cual están, sin codificación previa)
Uso:
desaconsejado
Delimitador de campos:
retorno de carro
Formato recepción de datos:
Ejemplo para un formulario con dos campos de textos (nombre y edad)
nombre=JuanPérez
edad=90
El uso del valor text/plain se desaconseja ya que al emplear el retorno de carro como delimitador, dificulta la
obtención de datos en bloques de texto que incluyan el salto de línea.
Para el común de los formularios, no es necesario declarar el enctype.
Declararlo como multipart/form-data si se trabajará con la carga de archivos.
MANIPULANDO DATOS DESDE PYTHON Y WSGI
Cuando se reciben datos mediante POST, siempre se necesita tener acceso a dos factores: el nombre de los
campos y su correspondiente valor. En Python, la forma lógica de asociar un nombre de campo a un valor, es
utilizar un diccionario:
datos = dict(campo1='valor del campo 1', campo2='valor del campo 2')
The Original Hacker – www.originalhacker.org
®2013, 2014 Eugenia Bahit – www.eugeniabahit.com – Bajo Licencia Creative Commons BY-NC-SA
6
Lo que se debe lograr entonces, es crear un diccionario con dicha información convirtiendo los datos recibidos
en un diccionario.
La forma de lograr esta conversión, depende directamente del modelo de codificación con el que la
información haya sido enviada, es decir que depende del enctype que se haya declarado en el formulario.
Cuando se trabaja con WSGI los datos enviados por POST se almacenan en la clave wsgi.input del
diccionario environ (que WSGI entrega a la función application) y se obtienen leyendo dicho elemento
con el método read() tal como se muestra a cotinuación:
datos = environ['wsgi.input'].read()
Retornatará algo como: campo1=valor1&campo2=valor2
APPLICATION/X-WWW-FORM-URLENCODED
Recordemos que éste, es el valor por defecto de todo formulario. Si no se ha asignado un enctype, los datos
serán codificados siguiendo este formato.
Como el delimitador de campos es el signo &, podemos obtener una lista donde cada elemento sea un par
clave=valor
datos = environ['wsgi.input'].read().split('&')
Luego, en cada elemento de la lista, el signo = separa al nombre del campo de su valor correspondiente con lo
que ya tenemos todos los elementos necesarios para armar el diccionario:
datos = environ['wsgi.input'].read().split('&')
POST = {}
for par in datos:
campo, valor = par.split('=')
POST[campo] = valor
Recordemos que los datos son codificados en formato ASCII Hexadecimal y los espacios en blanco, sustituidos
por el signo +. Podemos volver los valores a su estado puro, utilizando la función unquote del módulo
urllib2 y reemplazando el signo + por un espacio en blanco:
from urllib2 import unquote
datos = environ['wsgi.input'].read().split('&')
The Original Hacker – www.originalhacker.org
®2013, 2014 Eugenia Bahit – www.eugeniabahit.com – Bajo Licencia Creative Commons BY-NC-SA
7
POST = {}
for par in datos:
campo, valor = par.split('=')
POST[campo] = unquote(valor).replace('+', ' ')
De esta forma, habremos obtenido un diccionario como el siguiente:
{
'nombre': 'Juán Pérez',
'edad': '65',
'nacionalidad': 'uruguaya'
}
Al cual podremos acceder utilizando el nombre de los campos como nombre de clave:
nombre = POST['nombre'] if 'nombre' in POST else ''
edad = POST['edad'] if 'edad' in POST else ''
nacionalidad = POST['nacionalidad'] if 'nacionalidad' in POST else ''
RECOGER GRUPOS DE DATOS
En cualquier formulario Web, es frecuente tener grupos de opciones bajo un mismo nombre. Es el caso de los
campos de tipo checkbox y los de tipo select múltiple:
<input type='checkbox' name='grupo_a' value='1' checked>Opción 1<br>
<input type='checkbox' name='grupo_a' value='2'>Opción 2<br>
<input type='checkbox' name='grupo_a' value='3' checked>Opción 3<br>
<select name='combo' size='3' multiple>
<option value='1'>Opción 1</option>
<option value='2'>Opción 1</option>
<option value='3'>Opción 1</option>
<option value='4'>Opción 1</option>
<option value='5'>Opción 1</option>
</select>
Cuando éste es el caso, los valores elegidos no son agrupados al momento de enviarse. Por el
contrario, el nombre del campo se repetirá tantas veces como opciones se hayan elegido.
Lo que se pretende entonces es, capturar las op
Comentarios de: the original hacker 05 201404 (0)
No hay comentarios