jueves, 27 de diciembre de 2012

Nada en particular.

Hace ya poco más de un mes que comencé un proyecto Web personal, de esos en los que se suele invertir mucho y que seguramente nos dejara poca ganancia monetaria pero mucha, mucha intelectual, cuyo valor no es para nada despreciable.. :)

Comencé a hacer un juego de navegador. Siempre me llamaron la atención algunos juegos simples pero no por ello poco "enviciantes". Me preguntaba que es lo que habría detrás de esos juegos, que tanta estructura de personal y que tanto hardware sería necesario para hacer y mantener un juego on-line.
Por ahora el proyecto es unipersonal y lo vengo llevando bastante bien.. Creo que todo esta en el análisis y en saber hacia el lugar al que debe ir el proyecto.. Lo cual no se limita únicamente a los juegos, sino que es extensible a cualquier proyecto software.

Con este proyecto me estoy dando cuenta de algunas cosas bastante agradables. Por ejemplo:

  • Que no hace falta usar grandes framework para hacer un buen trabajo web con PHP. 
  • Que las formas de evitar los ataques de XSS, no son tan complejas como muchos nos quieren vender.
  • Y que se puede ser prolijo programando con PHP.. jeje

Si quieren que les di una mini receta para evitar los ataques de XSS, sería:


  1. Validar todos los datos de entrada, que puedan llegar a la Base de datos. Si son datos de tipo Entero, validar que nos hayan ingresado solo valores enteros. :).. con PHP asi como con la mayoria de lenguajes de programación de alto nivel, esto es muy sencillo y se resuelve en una sola linea.. 
  2. Si los campos que les pueden ingresar, son de tipo texto la validación es un poco mas complicada, porque siempre esta la posibilidad que nos quieran inyectar código si no dejamos controlados caracteres tales como las comillas simples (').
Si hacemos que a partir del ingreso de un formulario si ejecute algo similar a esto:

select * from tabla1 where nombreCampo = 'Valor ingresado desde el formulario';

estariamos dandole la posibilidad a algun usuario malicioso de ingresar en el formulario por ejemplo el valor.

' basura

Con lo cual fallaría la sentencia SQL si esto no esta controlado y quizas el error obtenido le daria pistas al usuario mal intencionado de obtener información acerca de la estructura de nuestra Base de datos que no queremos que sea pública.

Para hacer la validacion de campos de texto, lo que puedo recomendar es 

hacer la conexión con mysqli de la siguiente manera:

$conexion = new mysqli("<hostname>", nombreUsuario, password, nombreBaseDeDatos);

Esta forma de conexión nos brinca la posibilidad de utilizar las sentencias prepare y bind_param

Prepare sirve para "preparar" la consulta que luego querremos ejecutar en la base de datos, y nos permite dejar sin enlazar los parametros, son el uso de los signos de pregunta (?). 

$consulta=$conexion->prepare("insert into tabla
   (valorEntero1,  valorEntero2 , valorCadena,  valorEntero3) 
values 
(?, ?, ?, ?)");

Luego con la sentencia bind_param, bindeamos los signos de preguntas con los valores que le queremos pasar a la secuencia SQL. El primer parámetro de bind_param es una cadena con el formato de los parámetros que se insertaran a continuación. "iisi" significa que el primer parámetro es (i) (INTEGER), que el segundo parametro es (i) INTEGER que el tercer parámetros es (s) STRING y que el cuarto y último parámetro es (i) INTEGER. 
$res = $consulta->bind_param("iisi",$val1,$val2,$str1,$val3);
if($res){
$res = $consulta->execute();
        }

Con esto tendríamos validados los campos de tipo texto... Previo a hacer el binding, deberíamos comprobar que los valores integer, sean realmente enteros. Ya que en mi versión no se porque razón no falla cuando le envió cadena en los datos de tipo entero. :)



Bueno solo quería contar esa pequeña experiencia..
Supongo que seguiré comentando algunas cosas más de mi desarrollo en los dias subsiguiente..