jueves, 11 de agosto de 2011

Asegurar código PHP heredado.

Estoy revisando una aplicación en PHP, ya hace lo que debe hacer, ya está en español, tiene las modificaciones necesarias .... ahora falta asegurarla.

Creo que al menos 2 procesos básicos son los necesarios, protegerla de SQLi y de RFI. (inyección de código SQL e Inclusión de archivos remotos).

Para el primer punto, hay que "limpiar" las entradas que recibe la aplicación del usuario, considerando que los usuarios pueden ser hostiles.

se me ocurren 2 cosas addslashes y mysql_real_escape_string, las cuales escapan los caracteres ' " NULL y les antepone \ y puede servir para almacenar contraseñas del tipo ' or ''=''

Al parecer la más recomendada es mysql_rel_escape_string, solo que debes tener un enlace a la base de datos, porque el trabajo lo hace el mysql.

La verdad preferiría poder utilizar algún patron de diseño que me protegiera del SQLi, pero sería reescribir casi toda la aplicación. así que mejor utilizaré el escape.

vienen unas lines que podrían ser muy útiles y rápidas de implementar :

$_GET = array_map('mysql_real_escape_string', $_GET);
$_POST = array_map('mysql_real_escape_string', $_POST);
$_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
$_REQUEST = array_map('mysql_real_escape_string', $_REQUEST);
En esta presentación sobre SQLi también recomiendan utilizar procedimientos almacenados.

Otro punto muy IMPORTANTE de la presentación:
Filtra/valida las entradas escapa las salidas.

Para escapar las salidas, puedes utilizar htmlentities, a menos que permitas HTML almacenado o como parámetros, de otra forma, puedes evitar también ataques XSS.

Estas recomendaciones también se muestran acá. Donde es todo un lista de cotejación para ver si tu aplicación está asegurada.

Por último, no dejes sola la aplicación, revísala constantemente junto con sus logs. Tal vez alguién ya metió gol y tu todavía no sabes.



martes, 9 de agosto de 2011

Usar el navegador de forma "Anónima"

El título puede ser algo confuso con lo que quiero compartir, pero intentaré comenzar a explicarlo con un ejemplo.

Estoy navegando, tengo varios sitios abiertos, algunos de los cuales te dan seguimiento como google por ejemplo, o bing. Y si tengo activa mi cuenta y abro otra pagina del buscador, sabe quien soy y que estoy buscando.

Los navegadores tienen una opción de navegar de incógnito, donde "se supone" no dejas rastro en la PC en la que estás. Pero aún cuando abres una ventana o pestaña en este modo, si ingresas al buscador, sigue leyendo tus preferencias, tus cookies etc. etc. Así que te sigue reconociendo.

Existe la teoría que te pueden identificar plenamente por las cadenas del navegador, cookies y esas cosas, así que buscando una forma de que esto no sea tan sencillo progongo lo siguiente (que es lo estoy usando actualmente):

Utilizar las opciones de chromium-browser específicamente para tratar de resolver la situación de una navegación un poco mas PRIVADA.

hugo@Atenea:~/Escritorio$ chromium-browser --user-data-dir=/tmp/otra --temp-profile --incognito --user-agent="Mozilla/5.0(iPad; U; iPhone OS 3_2; en-us) AppleWebKit/531.21.10 Mobile/7B314" http://www.google.com

--user-data-dir sirve para decirle donde se almacenará la información de usuario del navegador, de esta forma no lee las cookies que ya tengas, y puedes seguir con sesiones abiertas en otras ventanas del navegador.
--temp-profile para que sea perfil temporal
--incognito modo incognito o privado
--user-agent identifica al navegador, con la cadena de ejemplo simula ser un iPad.

Así navego de manera tradicional y de manera privada al mismo tiempo.