Evitar sql injection y xss

Cristian Rodriguez crrodriguez en suse.de
Vie Sep 21 01:44:45 CLT 2007


Raul Perez escribió:
> Salud a todos
> 
> Tengo mysql 5 y phpp 5 en un servidor con centos
> La pregunta es que codigo han implementado ustedes para
> asegurar sus aplicaciones en php para evitar injection de sql y xss


Ok, veamos.

Para prevenir XSS, utiliza un sistema de templates como PHPTAL,
Html_template_flexy o cualquier otro que siga la siguiente regla
"elemental" :

pasar por htmlspecialchars con la codificacion correcta cualquier
"placeholder" al que se le asignen variables a mostrar en pantalla, a no
ser que tu deliberadamente le digas lo contrario. ( esto es un sistema
de whitelist) cualquier otra forma es propensa a demasiados errores
involuntarios.

Puedes validar con expresiones regulares u otros por otras razones, pero
lo mas imporante es la forma en la cual los datos son **enviados** al
navegador, no de la forma que son recibidos, XSS mas que un problema de
input es de **output**, evita modificar,eliminar,alterar los datos
enviados por el usuario, si no corresponden al formato esperado, emite
un error, si es de formato libre, solo preocupate de que cuando estos se
muestren el navegador, este los interprete de forma segura y recuerda
que esto es valido tanto como para los datos que vienen desde usuario
como los que vienen de la DB.( si olvidas esto ultimo vas a caer en una
injeccion de "segundo orden" donde te atacan con los datos ya
almacenados ;) )


Para prevenir sql injection, utiliza un sistema de ORM o en su defecto
alguna biblioteca especializada como Creole, Adodb , MDB2 , PDO que
permita utilizar consultas preparadas y/o "bound parameters" y obliga al
programador a utilizarlas como costumbre, en todas las consultas que
utilizen variables, no importa si esas variables vienen o no vienen
directamente del usuario..cualquier otro metodo que utilizes vas en
directa picada al fracaso, porque siempre se te puede olvidar utilizar
mysql_real_escape_string() en 1 de las miles o millones de variables que
pueda tener tu aplicacion.

Ademas asegurate que tu base de datos utilize la misma codificacion de
caracteres que tu aplicacion y que el cliente que se conecta a esta
tambien, en ciertos casos puede generarse un problema de seguridad
cuando la codificacion de caracteres no coincide.

Por ultimo no utilizar addslashes() o cualquier otra funcion "tuya" para
 escapar los parametros de las consultas, utiliza solo las funciones
especificas y recomendadas para cada  DBMS en particular.


Espero que te sea de ayuda.

Saludos.


-- 
"You don't have to burn books to destroy a culture. Just get people to
stop reading them." --Ray Bradbury

Cristian Rodríguez R.
SUSE LINUX Products GmbH
Research & Development


Más información sobre la lista de distribución Linux