3. INTRODUCION
¿Qué es web2py?
Creado por una comunidad de profesionales y profesores universitarios en Ciencias de
la Computación e Ingeniería de Software.
Siempre compatible con versiones anteriores. No hemos roto la compatibilidad hacia
atrás desde la versión 1.0 en 2007, y nos comprometemos a no romper en el futuro.
Fácil de ejecutar. No requiere instalación ni configuración.
Se ejecuta en Windows, Mac, Unix / Linux, Google App Engine, Amazon EC2, y casi
cualquier alojamiento web a través de 2.5/2.6/2.7 Python o Java con Jython.
Funciona con Apache, Lighttpd, Cherokee y casi cualquier otro servidor web a través de
CGI, FastCGI, WSGI, mod_proxy, y / o mod_python. Puede insertar terceros WSGI
aplicaciones y middleware.
Habla con SQLite, PostgreSQL, MySQL, MSSQL, Firebird, Oracle, IBM DB2, Informix,
Ingres, y Google App Engine.
Asegure Evita los tipos más comunes de vulnerabilidades , incluyendo secuencias de
comandos entre sitios, los errores de inyección y ejecución de ficheros malintencionados.
Hace cumplir las buenas prácticas de ingeniería de software (validación del diseño, la
forma del lado del servidor Modelo-Vista-Controlador, devoluciones de datos) que hacen
que el código sea más legible, escalable y fácil de mantener.
Habla varios protocolos HTML / XML, RSS / ATOM, RTF, PDF, JSON, AJAX, XML-RPC,
CSV, REST, WIKI, Flash / AMF y Linked Data (RDF).
Incluye un servidor con SSL y con capacidad de streaming web, una base de datos
relacional, un entorno de desarrollo integrado basado en la web y la interfaz de
administración basada en web, la capa de abstracción de base de datos SQL que escribe
para usted en tiempo real, soporte de internacionalización, múltiples métodos de
autenticación, control de acceso basado en roles, un error de registro y emisión de billetes
del sistema, múltiples métodos de almacenamiento en caché para la escalabilidad, la
biblioteca jQuery para AJAX y los efectos, y una aplicación de andamiaje para impulsar el
desarrollo.
La mejor manera de entender web2py es intentarlo. Puedes probar en línea aquí (esta versión
en línea es idéntica a la web2py real aunque algunas funciones están desactivadas por
razones de seguridad).
web2py se inspiró en Ruby on Rails y, como Rails, se centra en el desarrollo rápido y sigue un
diseño Modelo Vista Controlador. web2py se diferencia de Rails, ya que está basado en
Python (por lo tanto, es más rápido y más escalable), ya que proporciona una interfaz de
administración basada en la Web completa (por lo tanto no hay necesidad de escribir nunca
comandos de shell a menos que desee), incluye bibliotecas para manejar más protocolos (por
ejemplo, XML-RPC y RSS), y se pueden ejecutar en el Google App Engine.
4. web2py también fue inspirado por Django y como Django, que tiene la capacidad de generar
formas de las tablas de base de datos e incluye un amplio conjunto de validadores. web2py se
diferencia de Django, ya que es más compacto, más fácil de aprender y no tiene ningún
archivo de configuración a nivel de proyecto.
web2py es menos detallado que los marcos basados en Java y su sintaxis es mucho más
limpio que los marcos basados en PHP. Esto hace más sencillo el desarrollo de aplicaciones y
más fácil de leer y de mantener.
Aquí es una comparación de las características web2py vs otros frameworks web populares.
web2py viene en versión de código fuente (para cualquier sistema operativo que se ejecuta
Python) y en las versiones binarias para OSX y Windows. web2py no necesita ser
instalado. Puedes descomprimirlo, haga clic en él, y elegir una contraseña de administrador de
una sola vez. A continuación, se abre el navegador para usted y le dirige a la interfaz
administrativa. Todo lo que necesita para hacer que esto ocurra (el intérprete de Python, el
servidor web, la base de datos relacional, etc) ya está empaquetado con web2py. Si usted
necesita más poder de personalizar sus aplicaciones para usar el servidor web preferido (por
ejemplo Apache) y el motor de base de datos preferido (por ejemplo PostgreSQL y Oracle).
A través de la interfaz de administración puede cargar una aplicación empaquetada, cree una
nueva aplicación, el diseño de una aplicación, mantener una aplicación existente, bytecode a
compilar una aplicación, mochila y descargar una aplicación. Todo se puede hacer a través de
la interfaz de administración basada en la web, incluyendo la edición de los archivos que
componen las aplicaciones, borrar archivos temporales, navegar entradas pasadas / errores,
ejecutar pruebas, interactuar con la base de datos. Si así lo desea, también es posible
interactuar con web2py a través de la shell del sistema operativo o de la terminal de Python.
Cualquier aplicación web2py está compuesta por modelos (archivos que contienen una
descripción de la representación de los datos), Vistas (archivos que contienen una descripción
de la presentación de los datos), controladores (archivos que contienen una descripción de la
lógica del negocio y flujo de trabajo), Cron Jobs ( tareas que deben ejecutarse periódicamente
en segundo plano), Módulos (colecciones de clases reutilizables y funciones) y archivos
estáticos (imágenes, scripts, hojas de estilo, etc.)
Controladores consisten en funciones que se asocian a una URL y se llaman cuando se visita
la URL asociada. Los modelos se ejecutan antes de llamar a la función, independientemente
de la URL visitada (para cada aplicación). Las vistas se llama cuando la función devuelve
datos distintos de una cadena, y hace que los datos en el formato correcto (por ejemplo, html).
Una aplicación web2py puede ser tan simple como un único archivo (controladores /
default.py) que contiene:
def index (): return "Hola Mundo"
Cuando http://localhost:8000/app/default/index se visitó la función es llamada y muestra el
mensaje "Hello World".
5. Aquí es una completa aplicación más compleja que permite a los visitantes subir imágenes en
una base de datos:
En el modelo
1. db=DAL('sqlite://storage.db')
2. db.define_table('image',
. 3
4.
Field('name', notnull=True),
Field('file','upload'))
En Controller
1. def índice ():
2.
3.
4.
5.
tipo = SQLFORM ( db . imagen .) proceso ()
si forma . aceptada :
la respuesta . Flash = 'Imagen cargada'
retorno lugareños ()
En Vista
1. {{ extender 'layout.html " }}
2. < h1 > Imagen formulario de subida </ h1 >
3. {{= forma }}
Las imágenes subidas se cambia de manera segura para evitar vulnerabilidades de salto de
directorio, almacenados en el sistema de ficheros (o base de datos) y una entrada
correspondiente se inserta en la base de datos, vincular el archivo. Un mecanismo integrado
impide la sumisión involuntaria forma doble. Todos DB IO es transacción segura por
defecto. Cualquier excepción en el código hace que la operación de reversión.
DEFINICION
web2py es una plataforma web libre de código abierto para el ágil desarrollo de aplicaciones
web seguras, sustentadas en base de datos. Está escrito en python y es programable
en python; web2pyes una plataforma completa, lo que significa que contiene todos los
componentes
necesarios
para
construir
aplicaciones
web
completamente
funcionales; web2py está diseñado de manera que guía al desarrollador web a aplicar buenas
prácticas de ingeniería de software, tales como el uso del patrón Model View Controler
(MVC); web2py separa la representación de datos (el modelo) de la presentación de datos (la
vista) y también de la lógica de la aplicación y flujo de trabajo (el
controlador); web2py proporciona bibliotecas para ayudar a los desarrolladores a diseñar,
implementar y probar cada una de estas tres partes por separado, para luego trabajar juntas.
6. web2py está diseñado para tener seguridad. Esto significa que automáticamente resuelve
muchos de los problemas que pueden dar lugar a vulnerabilidades de seguridad, siguiendo
prácticas bien establecidas. Por ejemplo, valida todas las entradas (para evitar las inyecciones
de código), escapa todas las salidas (para evitar el cross-site scripting), cambia el nombre de
los archivos cargados (para prevenir ataques que recorran el directorio). web2py deja poco
espacio de maniobra a los desarrolladores de aplicaciones en cuestiones relativas a la
seguridad.
web2py incluye una capa de abstracción de base de datos (DAL por su acrónimo en Inglés)
que escribe SQL dinámicamente para que usted, el desarrollador, no tenga que hacerlo. El
DAL sabe cómo generar SQL de forma transparente para Sqlite, Mysql, PostgreSQL, MSSQL,
FireBird, Oracle,IBM DB2,Informix e Ingres.El DAL también puede generar llamadas a
funciones para Google BigTable cuando se ejecuta en el Google App Engine (GAE). Una vez
que una o más tablas de bases de datos están definidas, web2py también genera una interfaz
de administración de base de datos basada en la web, la cual es totalmente funcional para
acceder a la base de datos y las tablas.
web2py difiere de otras plataformas web porque es la única que acoge plenamente el
paradigma Web 2.0, donde la red es el computador. De hecho, web2py no requiere instalación
o configuración, sino que funciona en cualquier arquitectura en la que se puede ejecutar
python (Windows, Windows CE, Mac OS X, iPhone, y Unix/Linux), y las fases de desarrollo,
despliegue y mantenimiento para las aplicaciones se pueden hacer mediante una interfaz web
local o remota. web2py se ejecuta con Cpython (la implementación C) y Jython (la
implementación Java), versiones de 2.4 , 2.5 y 2.6 aunque “oficialmente” sólo soporta 2.5 para
así poder garantizar la compatibilidad con versiones previas de aplicaciones.
web2py proporciona un sistema de boletos. Si ocurre un error, los boletos se expiden para el
usuario, y el error se registra para el administrador.
web2py es de código abierto y está liberado bajo la licencia GPL 2.0, pero las aplicaciones
desarrolladas con web2py no están sujetas a ninguna restricción de licencia. De hecho,
siempre y cuando no contengan el código fuente web2py, no se consideran “obra
derivada”. web2py también le permite al desarrollador compilar en bytecode las aplicaciones y
distribuirlas como de código cerrado, aunque se requiera web2py para ejecutarlas. La
licencia web2py incluye una excepción que permite a los desarrolladores web enviar sus
productos con binarios originales web2py pre-compilados, sin el acompañamiento del código
fuente.
Otra característica de web2py es que nosotros, sus desarrolladores, nos comprometemos a
mantener la compatibilidad con versiones previas en futuras versiones. Lo hemos hecho
desde la primera versión de web2py en octubre de 2007. Nuevas funciones se han añadido y
errores se han corregido, pero si un programa trabajó con web2py 1.0, el programa seguirá
funcionando en la actualidad.
Estos son algunos ejemplos de declaraciones web2py que ilustran su potencia y simplicidad.
El siguiente código:
1
db.define_table('person', Field('name'), Field('image', 'upload'))
7. Crea una tabla de base de datos llamada “person” con dos campos: “name”, una cadena; e
“image”, algo que necesita ser cargado (la imagen real). Si la tabla ya existe, pero no coincide
con esta definición, se cambia de manera acorde.
Dada la tabla definida anteriormente, el siguiente código:
1
form = crud.create(db.person)
Crea un formulario de ingreso de datos para esta tabla que permite a los usuarios cargar
imágenes. También valida los datos ingresados al formulario, le cambia el nombre a la imagen
cargada en forma segura, almacena la imagen en un archivo, inserta el registro
correspondiente en la base de datos, impide que se trate de registrar de nuevo, y
eventualmente modifica el formulario en sí agregando mensajes de error si los datos
presentados por el usuario no pasan la validación.
El siguiente código:
@auth.requires_permission('read','person')
def f(): ....
Evita que el visitante acceda a la función f a menos que éste sea miembro de un grupo cuyos
miembros tienen permisos para “leer” los registros de la tabla “person”. Si el visitante no ha
iniciado sesión, se le direcciona a una página para hacerlo (generada por defecto
por web2py).
El siguiente código incorpora un elemento de página.
{{=LOAD('other_controller','function.load',ajax=True, ajax_trap=True)}}
Esto le dice a web2py que cargue en una vista el contenido generado por la
función other_controller (funciona con cualquier función). Carga el contenido a través de
Ajax, lo inserta en la página actual (utilizando la disposición actual y no la de la
función other_controller), y encierra todos los formularios que están en el contenido cargado
de tal modo que también son enviados a través de Ajax sin recargar la página. También puede
CARGAR (LOAD) el contenido de aplicaciones que no son web2py.
El ayudante de carga (LOAD) permite un diseño modular de aplicaciones; ésto se discute en
detalle en el último capítulo de este libro.
Principios
La programación python típicamente sigue estos principios básicos:
No te repitas (DRY por su acrónimo en Inglés).
Debe haber una sola manera de hacer las cosas.
Explícito es mejor que implícito.
8. web2py abarca plenamente los dos primeros principios, forzando al desarrollador a utilizar
buenas prácticas de ingeniería de software que desalientan la repetición de
código. web2py guía al desarrollador a través de casi todas las tareas comunes en el
desarrollo de aplicaciones web (la creación y el procesamiento de formularios, gestión de
sesiones, cookies, errores, etc.).
web2py se diferencia de otras plataformas en relación con el tercer principio, que a veces
entra en conflicto con los otros dos. En particular, web2py no importa aplicaciones de usuario
sino que las ejecuta en un contexto predefinido. Este contexto expone las palabras clave de
python, así como las palabras clave de web2py.
Para algunos esto puede parecer magia, pero no debería. En la práctica, simplemente algunos
módulos ya se han importado sin que usted tenga que hacerlo. web2py está tratando de evitar
la molesta característica de otras plataformas de forzar al desarrollador a importar los mismos
módulos en la cabecera de cada modelo y controlador.
web2py, al importar sus propios módulos, ahorra tiempo y evita errores, siguiendo así el
espíritu de “no te repitas” y “debe haber una sola manera de hacer las cosas”.
Si el desarrollador desea utilizar otros módulos de python o módulos de terceros, éstos deben
ser importados de forma explícita, como en cualquier otro programa de python.
Plataformas Web
En su nivel más fundamental, una aplicación web se compone de un conjunto de programas (o
funciones) que se ejecutan cuando el URL correspondiente es visitado. La salida del programa
se ofrece al visitante y es mostrada por el navegador.
El propósito de las plataformas web es permitir a los desarrolladores crear nuevas
aplicaciones de forma rápida, fácil y sin cometer errores. Esto se hace proporcionando APIs y
herramientas que reducen y simplifican la cantidad de códigos que se necesitan.
Los dos enfoques clásicos para el desarrollo de aplicaciones web son:
Generación de HTML programando.
Inserción de código en páginas HTML.
El primer modelo fue seguido, por ejemplo, para los primeros scripts CGI. El segundo modelo
fue seguido, por ejemplo, por PHP (donde el código está en PHP, un lenguaje parecido a C),
ASP (donde el código está en Visual Basic), y JSP (aquí el código está en Java).
Aquí presentamos un ejemplo de un programa PHP que, cuando se ejecuta, recupera datos
de una base de datos y devuelve una página HTML que muestra los registros seleccionados:
1
2
3
4
5
6
7
<html><body><h1>Records</h1>
mysql_connect(localhost,username,password);
@mysql_select_db(database) or die( "Unable to select database");
$query="SELECT * FROM contacts";
$result=mysql_query($query);
mysql_close();
9. 8
9
10
11
12
13
$i=0;
while ($i < mysql_numrows($result)) {
$name=mysql_result($result,$i,"name");
$phone=mysql_result($result,$i,"phone");
echo "<b>$name</b><br>Phone:$phone<br /><br /><hr /><br />";
$i++;
}
?></body></html>
El problema con este enfoque es que el código está embebido en páginas HTML, pero este
mismo código también necesita generar HTML adicional y generar las instrucciones SQL para
consultar la base de datos, enredando múltiples capas de la aplicación y haciéndola difícil de
leer y mantener. La situación es aún peor para las aplicaciones Ajax y la complejidad aumenta
con el número de páginas (archivos) que componen la aplicación.
La funcionalidad del ejemplo de arriba puede expresarse en web2py con dos líneas de código
python:
1
2
def index():
return HTML(BODY(H1('Records'), db().select(db.contacts.ALL)))
En este sencillo ejemplo, la estructura de las páginas HTML se representa mediante
programación por el HTML, BODY y los objetos H1, la base de datos db es consultada por la
orden select y, finalmente, todo se serializa en HTML. Observe que db no es una palabra
clave, sino una variable definida por el usuario. Vamos a utilizar ese nombre constantemente
para referirnos a una conexión de base de datos para evitar confusiones.
Las plataformas Web suelen ser catalogadas como uno de estos dos tipos: Una plataforma
“adherida” que se construye mediante el ensamblaje (adhesión) de varios componentes de
terceros. Una plataforma “apilada completamente” que se construye mediante la creación de
componentes diseñados específicamente para ser integrados estrechamente y que trabajen
juntos. web2py es una plataforma “apilada completamente”. Casi todos sus componentes se
construyen a partir de cero y están diseñados para trabajar juntos, pero funcionan igual de
bien fuera de la plataformaweb2py. Por ejemplo, la capa de abstracción de base de datos
(DAL) o el lenguaje de la plantilla se puede utilizar independientemente del
marco web2py importando gluon.sql o gluon.templatedentro sus propias aplicaciones
python. Gluon es el nombre del módulo web2py que contiene librerías del sistema. Algunas
librerías de web2py, tales como las de los formularios para la construcción y el procesamiento
de tablas de base de datos, tienen dependencias en otras partes de web2py. web2py también
puede trabajar con las librerías de python de terceros, incluidos otros lenguajes de plantillas y
DALs, pero no estarán tan bien integradas como los componentes originales.
Modelo-Vista-Controlador
web2py incentiva al desarrollador a que separe la representación de los datos (el modelo), la presentación de datos (la vista) y el flujo de
trabajo de la aplicación (el controlador). Consideremos de nuevo el ejemplo anterior y veamos la forma de construir una
aplicación web2py basado en él. He aquí un ejemplo de la interfaz de edición web2py MVC:
10. El flujo de trabajo típico de una petición en web2py se describe en el siguiente diagrama: En el diagrama:
11. En el diagrama:
El servidor puede ser el servidor incluido en web2py o un servidor de terceros, tal
como Apache. El servidor maneja multi-tarea.
“principal” es la aplicación principal WSGI. Realiza todas las tareas comunes y
envuelve las aplicaciones de usuario. Se encarga de los cookies, sesiones,
transacciones, enrutamiento de url y enrutamiento inverso, además de la distribución.
Este puede ofrecer y transmitir archivos estáticos si es que el servidor web no lo está haciendo
ya:
Los Modelos, Vistas y componentes del Controlador componen la aplicación de
usuario.
Se pueden alojar múltiples aplicaciones en la misma instancia web2py.
Las líneas punteadas representan la comunicación con el motor(es) de base de datos.
Las consultas de base de datos se pueden escribir en SQL crudo (no se aconseja) o
utilizando la capa de abstracción de base de datos (recomendado), de modo que el
código de aplicación web2py no dependa de un motor de base de datos particular.
El despachador “mapea” la dirección URL solicitada a una llamada de función en el
controlador. La salida de la función puede ser una cadena o un diccionario de
símbolos (una tabla hash). Los datos en el diccionario son representados por una
vista. Si el visitante solicita una página HTML (por defecto), el diccionario se
representa en una página HTML. Si el visitante solicita la misma página en
XML, web2py trata de encontrar una vista que pueda presentar el diccionario en
formato XML. El desarrollador puede crear vistas para presentar páginas en cualquiera
12.
de los protocolos ya soportados (HTML, XML, JSON, RSS, CSV, RTF) o en otros
protocolos personalizados.
Todas las llamadas se encierran en una transacción, y cualquier excepción no
detectada hace que la transacción se cancele. Si la solicitud se realiza correctamente,
la transacción se confirma.
web2py también se ocupa de las sesiones y cookies de sesión de forma automática, y
cuando una transacción se confirma, la sesión también se almacena, a menos que se
especifique lo contrario.
Es posible registrar tareas recurrentes (a través de cron) para ejecutarse en horas
específicas y/o después de la realización de determinadas acciones. De esta manera
es posible ejecutar tareas computacionales largar e intensivas en segundo plano sin
que la navegación se ponga lenta.
Aquí se presenta una completa y minimalista aplicación MVC, que consta de tres archivos.
“db.py” es el modelo:
1
2
3
4
db = DAL('sqlite://storage.sqlite')
db.define_table('contacts',
Field('name'),
Field('phone'))
Se conecta a la base de datos (en este ejemplo una base de datos SQLite almacenada en el
archivo storage.sqlite) y define una tabla llamada contacts. Si la tabla no existe, web2py la
crea y, de forma transparente y en segundo plano, genera código SQL en el dialecto SQL
adecuado para el motor de base de datos específico usado. El desarrollador puede ver el SQL
generado, pero no necesita cambiar el código si la interfaz administrativa de la base de datos,
que por defecto es SQLite, se sustituye con MySQL, PostgreSQL, MSSQL, Firebird, Oracle,
DB2, Informix, Interbase, Ingres, o Google Big Tables o Google App Engine.
Una vez que una tabla está definida y creada, web2py también genera una interfaz de
administración de base de datos basada en web totalmente funcional, llamada appadmin, para
acceder a la base de datos y las tablas.
“default.py” es el controlador:
1
2
def contacts():
return dict(records=db().select(db.contacts.ALL))
En web2py, las direcciones URL se asignan a los módulos de python y a llamadas de
funciones. En este caso, el controlador contiene una sola función (o “acción”) llamada
contacts. Una acción puede devolver una cadena (la pagina web devuelta) o un diccionario
python (un conjunto de pares key: value). Si la función devuelve un diccionario, se pasa a una
vista con el mismo nombre que el del controlador/función, que a su vez devuelve la página. En
este ejemplo, la función contacts realiza un select de base de datos y devuelve los registros
resultantes como un valor asociado con la clave records del diccionario.
“default/contacts.html” es la vista:
{{extend 'layout.html'}}
<h1>Records</h1>
{{for record in records:}}
{{=record.name}}: {{=record.phone}}<br />
13. {{pass}}
Esta vista es llamada automáticamente por web2py después de que la función del controlador
asociado (acción) se ejecuta. El propósito de esta vista es devolver las variables en el
diccionario obtenido records =... al HTML. El archivo vista está escrito en HTML, pero inserta
código python delimitado por los delimitadores especiales {{y}}. Esto es muy diferente del
ejemplo de código PHP, ya que el único código insertado en el código HTML es el código de la
“capa de presentación”. El archivo “layout.html” al que se hace referencia en la parte superior
de la vista es proporcionado porweb2py y constituye la estructura básica para todas las
aplicaciones web2py. Dicho archivo puede ser fácilmente modificado o sustituido.
¿Por qué web2py?
web2py es una de las múltiples plataformas de aplicaciones web, pero tiene características
únicas y convincentes. web2py se desarrolló originalmente como una herramienta de
enseñanza, con las siguientes motivaciones principales:
Que sea fácil para los usuarios aprender desarrollo web del lado del servidor sin
comprometer funcionalidad. Por esta razón, web2py no requiere instalación ni
configuración; no tiene dependencias (excepto para la distribución de código fuente,
que requiere python 2.5 y sus módulos de librerías estándar) y expone la mayor parte
de su funcionalidad a través de una interfaz de navegador Web.
web2py se ha mantenido estable desde el primer día, dado que sigue un diseño de
arriba hacia abajo, es decir, su API fue diseñado antes de ser implementado. A pesar
de que nuevas funcionalidades han sido añadidas, web2py nunca ha roto la
compatibilidad con versiones anteriores, y no la romperá cuando se añadan
funcionalidades adicionas en el futuro.
web2py ataca de manera pro activa las cuestiones de seguridad más importantes que
aquejan muchas aplicaciones web modernas, según lo determinado por OWASP (19)
más abajo.
web2py es ligero. Sus librerías centrales, incluyendo la capa de abstracción de bases
de datos, el lenguaje de la plantilla y todas las ayudas constan en total de 1.4MB. Todo
el código fuente incluyendo aplicaciones de muestra e imágenes alcanzan los 10.4MB.
web2py ocupa poco espacio y es muy rápido. Utiliza el servidor Web Rocket(22) WSGI
desarrollado por Timothy Farrell. Es 30% más rápido que Apache con mod_proxy.
Nuestras pruebas también indican que, en un PC promedio, éste sirve una página
dinámica media sin acceso de base de datos en aproximadamente 10 ms. La DAL
tiene una tasa de sobrecarga muy baja, por lo general inferior al 3%.
WSGI (Web Server Gateway Interface) es un estándar python emergente
comunicaciones entre un servidor de web y aplicaciones Phyton.
A continuación una muestra de la pantalla de la principal interfaz admin de web2py:
para
14. Seguridad
El Proyecto de Seguridad de Aplicaciones Web Abiertas (19) (OWASP por sus siglas en
inglés) es una comunidad mundial abierta y libre enfocada en la mejora de la seguridad de
aplicaciones de software.
OWASP ha incluido los diez principales temas de seguridad que ponen en riesgo las
aplicaciones web. Dicha lista se reproduce aquí, junto con una descripción de cómo cada tema
es abordado por web2py:
“Cross Site Scripting (XSS): Las fallas de XSS ocurren cuando una aplicación toma los
datos suministrados por el usuario y los envía a un navegador web sin validar o
codificar el contenido. XSS permite a los atacantes ejecutar scripts en el navegador de
la víctima lo cual puede secuestrar sesiones de usuario, deformar sitios web,
posiblemente introducir gusanos, etc.”web2py_, por defecto, escapa todas las
variables presentadas en la vista, previniendo que ocurra XSS.
“Las fallas de inyección, en particular inyección SQL, son comunes en aplicaciones
web. La inyección se produce cuando los datos ingresados por el usuario son
enviados a un intérprete como parte de un comando o consulta. Los datos hostiles del
atacante engañan al intérprete para que ejecute comandos no deseados o cambie los
datos.” web2py_ incluye una Capa de abstracción de base de datos que hace
imposible la inyección SQL. Normalmente, las declaraciones SQL no están escritas
por el desarrollador. En su lugar, el código SQL es generado dinámicamente por el
DAL, asegurando que todos los datos insertados sean escapados correctamente.
“Ejecución de archivos maliciosos: Código vulnerable a la inclusión de archivos
remotos (RFI) permite a los atacantes incluir código hostil y datos, resultando en
ataques devastadores, como el compromiso total del servidor. web2py sólo permite
que sean ejecutadas las funciones expuestas, previniendo la ejecución de archivos
15.
maliciosos. Funciones importadas nunca son expuestas; sólo las acciones son
expuestas.” web2py_ utiliza una interfaz de administración basada en Web que hace
muy fácil hacer un seguimiento de lo que se expone y lo que no.
“Una referencia directa a objetos se produce cuando un desarrollador expone una
referencia a un objeto de implementación interna, tal como un archivo, directorio,
registro de base de datos, o clave, como una URL o un parámetro de formulario. Los
atacantes pueden manipular esas referencias para tener acceso a otros objetos sin
autorización. web2py no expone ningún objeto interno y además valida todas las
direcciones URL, con lo que logra la prevención de ataques que recorran el
directorio.” web2py_ también proporciona un mecanismo simple para crear formularios
que validan automáticamente todos los valores ingresados.
“Requerimiento falsificado Cross-site (CSRF): Un ataque CSRF obliga a una sesión de
usuario en el navegador de la víctima a enviar una solicitud pre-autentificada a una
aplicación web vulnerable, lo que entonces obliga al navegador de la víctima a realizar
una acción hostil en beneficio del atacante. CSRF puede ser tan poderosa como la
aplicación web que ataca.”web2py_ previene CSRF, así como el doble ingreso de los
datos en formularios mediante la asignación de una única ficha aleatoria a cada
formulario. Además web2py_ utiliza UUID para la cookie de sesión.
“Fugas de información y manejo de errores inapropiado: Las aplicaciones pueden
provocar fugas no intencionales de información relacionada con su configuración,
funcionamiento interno, o violar la privacidad a través de una variedad de problemas
de aplicación. Agresores utilizan esta debilidad para robar datos importantes, o realizar
ataques más graves.” web2py_ incluye un sistema de tickets. Ningún error puede
resultar en código que se expone a los usuarios. Todos los errores son registrados y
los tickets se expiden al usuario lo que permite el seguimiento del error. Errores y
códigos fuente son accesibles sólo para el administrador.
“Administración de sesión y autentificación rota: las credenciales de cuentas y las
fichas de sesión a menudo no son debidamente protegidas. Los atacantes
comprometen las contraseñas, claves o las fichas de autenticación para asumir las
identidades de otros usuarios.” web2py_ proporciona un mecanismo integrado para la
autenticación de administrador, y gestiona de forma independiente sesiones para cada
aplicación. La interfaz de administración también obliga a la utilización de cookies de
sesión segura cuando el cliente no es “localhost”. Para aplicaciones, incluye un
potente API de control de acceso basado en roles.
“Almacenamiento criptográfico inseguro: las aplicaciones web rara vez utilizan de
manera correcta las funciones criptográficas para proteger los datos y las
credenciales. Agresores utilizan datos protegidos débilmente para llevar a cabo el robo
de identidad y otros delitos, tales como fraude de tarjeta de crédito.” web2py_ utiliza
los algoritmos hash MD5 o HMAC la + SHA-512 para proteger las contraseñas
almacenadas. Otros algoritmos también están disponibles.
“Comunicaciones inseguras: Las aplicaciones frecuentemente fallan en encriptan el
tráfico de red cuando es necesario para proteger las comunicaciones
sensibles.” web2py_ incluye el servidor con SSL(21) Rocket WSGI, pero también
puede usar Apache o Lighttpd y mod_ssl para proporcionar cifrado SSL de las
comunicaciones.
“Falla en restringir acceso URL: Con frecuencia una aplicación sólo protege la
funcionalidad sensible al impedir la visualización de los enlaces o direcciones URL a
usuarios no autorizados. Atacantes pueden usar esta debilidad para acceder y realizar
operaciones no autorizadas mediante el acceso a las URL directamente.” web2py_
mapea las solicitudes de URL a los módulos y funciones de python. Además
proporciona un mecanismo para que se especifique cuáles son funciones públicas y
cuales requieren autenticación y autorización. El API de control de acceso basado en
roles incluido, permite a los desarrolladores restringir el acceso a cualquier función
16. basados en la sesión, pertenencia a grupos o permisos basados en grupos. Los
permisos son muy granulares y se pueden combinar con CRUD para permitir, por
ejemplo, acceso a los tablas y/o registros específicos.
web2py fue revisado en el aspecto de seguridad y usted puede encontrar el resultado de esta
revisión en la referencia 20.
Contenido del paquete
web2py se puede descargar desde el sitio web oficial:
http://www.web2py.com
web2py consiste de lo siguiente:
librerías: proporcionan funcionalidad básica del web2py y son accesibles mediante
programación.
servidor web: el servidor web Rocket WSGI.
la aplicación admin: se utiliza para crear, diseñar y administrar otras
aplicaciones web2py. Admin proporciona una solución completa basada en el Entorno
de Desarrollo Integrado Web (IDE) para la creación de aplicaciones web2py.
También incluye otras funcionalidades, como las pruebas basadas en web y un shell
basado en web.
La aplicación example: contiene la documentación y ejemplos interactivos. example es
un clon del sitio web oficial web2py.com, e incluye la documentación epydoc.
la aplicación welcome: la plantilla base para cualquier otra aplicación. Por defecto
incluye un menú en cascada CSS puro y autenticación de usuarios (se discute en el
capítulo 8).
web2py se distribuye en código fuente, y en formato binario para Microsoft Windows y para
Mac OS X.
La distribución de código fuente puede ser utilizada en cualquier plataforma donde python se
ejecuta e incluye los componentes antes mencionados. Para ejecutar el código fuente, se
necesita python 2.5 preinstalado en el sistema. También es necesario uno de los motores de
base de datos compatible ya instalado. Para pruebas y aplicaciones de poca demanda, puede
utilizar la base de datos SQLite, incluida en python 2.5.
Las versiones binarias de web2py (para Windows y Mac OS X) incluyen un intérprete para
python 2.5 y la base de datos SQLite. Técnicamente, estos dos no son componentes
de web2py. Su inclusión en las distribuciones binarias le permite usar web2py de inmediato.
La siguiente imagen describe la estructura general de web2py:
17. Licencia
La licencia web2py está registrada bajo GPL versión 2. El texto completo de la licencia está
disponible en la referencia 31. La licencia incluye pero no se limita a los siguientes artículos: 1.
Usted puede copiar y distribuir copias exactas del código fuente del Programa, según lo has
recibido, por cualquier medio, siempre que publique en cada copia un anuncio apropiado de
copyright y ausencia de garantía; mantenga intactos todos los anuncios que se refieran a esta
Licencia y a la ausencia de garantías, y proporcione a cualquier otro receptor del programa
una copia de esta licencia junto con el Programa. [...] 4. Usted no puede copiar, modificar,
sublicenciar o distribuir el Programa excepto como prevé expresamente esta Licencia.
Cualquier intento de copiar, modificar, sublicenciar o distribuir el Programa fuera de éstas
restricciones es nulo, y terminará automáticamente sus derechos bajo esta Licencia. [...] 11.
COMO EL PROGRAMA SE LICENCIA GRATIS, NO HAY GARANTÍA PARA EL PROGRAMA,
EN LA MEDIDA PERMITIDA POR LA LEY. EXCEPTO CUANDO ASÍ LO DECLAREN POR
ESCRITO LOS TITULARES DEL COPYRIGHT Y/ U OTRAS PARTES PROPORCIONAN EL
PROGRAMA <<TAL CUAL>>, SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA,
INCLUYENDO, PERO NO LIMITADA A, LAS GARANTÍAS IMPLÍCITAS DE
COMERCIALIZACIÓN Y CAPACIDAD PARA UN PROPÓSITO PARTICULAR . LA
TOTALIDAD DE LOS RIESGOS EN CUANTO A LA CALIDAD Y LOS RESULTADOS DEL
PROGRAMA SON SUYOS. SI EL PROGRAMA RESULTARA DEFECTUOSO, USTED
ASUME EL COSTO DE CUALQUIER SERVICIO, REPARACIÓN O CORRECCIÓN. EN
NINGÚN CASO A MENOS LO EXIJA LA LEY APLICABLE O HAYA SIDO ACORDADO POR
ESCRITO, NINGÚN TENEDOR DEL COPYRIGHT NI NINGUNA OTRA PARTE QUE
MODIFIQUE Y/O REDISTRIBUYA EL PROGRAMA EN LOS LUGARES PERMITIDOS,
SERÁN RESPONSABLES ANTE USTED POR DAÑOS, INCLUYENDO CUALQUIER DAÑO
GENERAL, ESPECIALES, INCIDENTALES O DERIVADOS DEL USO O INCAPACIDAD DE
USAR EL PROGRAMA (INCLUYENDO PERO NO LIMITADO A PÉRDIDA O LA
GENERACIÓN INCORRECTA DE DATOS O PÉRDIDAS SUFRIDAS POR USTED O
TERCERAS PARTES O UN FALLO DEL PROGRAMA AL FUNCIONAR CON CUALQUIER
OTRO PROGRAMA), INCLUSO SI DICHO TITULAR U OTRA PARTE HA SIDO ADVERTIDO
DE LA POSIBILIDAD DE TALES DAÑOS. web2py incluye código de otros (por ejemplo, el
intérprete de python, el servidor Rocket web , y algunas librerías JavaScript). Sus autores
respectivos y sus licencias son reconocidos en el oficial WebSite(1) y en el propio código. Las
aplicaciones desarrolladas con web2py, siempre y cuando no incluyan el código
fuente web2py, no se consideran obras derivadas. Esto significa que no están sujetos a la
licencia GPLv2, y usted puede distribuir las aplicaciones que desarrolló bajo cualquier licencia
que usted elija, incluyendo un código cerrado y/o licencia comercial. Excepción de la Licencia
Comercial La licencia web2py también incluye una excepción comercial:
Usted puede distribuir una aplicación que se desarrolló con web2py junto con una distribución
binaria oficial sin modificar de web2py, como la que puede descargarse de la página oficial(1),
siempre y cuando quede claro en la licencia de su aplicación cuales archivos pertenecen a la
aplicación y cuales pertenecen a web2py.
18. MANUAL DE INSTALACION
Descargar python de la página:
www.python.org
Nota que sea versión 2.7.X no la 3 a causa de incompatibilidad con el framwork web2py
20. Descarga web2py para el Sistema Operativo de su agrado.
Archivo ya descargados:
a) phython
b) web2py_win.zip
Descomprimir el archivo zip de web2py
21. Hacer doble click izquierdo en web2py.exe para iniciar la ejecución de web2py
Elegir la dirección IP a usar ya sea pública o local. Ademas de poner el puerto y un password
de administrador.
22. Ejecución de web2py en el navegador por defecto y luego hacer click en Interfaz
Administrativa.
23. Página de Administración de Aplicaciones.
Pagina para administrar la aplicación seleccionada anteriormente.