Cualquiera puede hacer una página web

Posted on Wednesday, August 25, 2010 in Programación web

Cualquiera puede hacer una página web

El título de esta entrada es ambiguo, ya que puede interpretarse como que "hacer páginas web es algo que está al alcance de todo el mundo" o como que "hasta al más inútil le dejan hacer una web".
Esta ambigüedad es intencionada, ya que la experiencia me ha demostrado que ambas interpretaciones son correctas, de hecho a menudo la primera implica la segunda.

Y es que claro, aunque cualquiera puede hacer una página web, no cualquiera puede hacer cualquier página web. No es lo mismo hacer un blog en Blogger que programar la web de Facebook.

Por eso, como ya he comentado alguna vez, he visto cosas que jamás creeríais, pero hace poco he visto una de las más impresionantes (en PHP):

$quux="\$_POST[foo" . $_POST['foo'] . "]";
eval("\$quux = \"$quux\";");

De lo que se deduce que tenemos un formulario que tendrá como mínimo algo parecido a esto:

<form method="post" action="form.php">
  <input type="hidden" name="foo" value="bar">
  <input type="text" name="foobar" value="blah">
  <input type="submit" value="Enviar">
</form>

Intenté explicar brevemente lo que hacía ese código PHP pero lo dejaré en manos de la habilidad del lector el intentar comprenderlo, que es más sencillo que explicarlo de tan enrevesado que es ese código en tan sólo dos líneas. Innecesariamente enrevesado ya que se podría hacer exactamente lo mismo con:

$quux=$_POST['foo'.$_POST['foo']];

Pero eso no es lo peor. Mientras la segunda opción es perfectamente segura, la primera permite fácilmente inyectar código sin necesidad de muchos conocimientos de programación gracias a ese maravilloso e innecesario eval sin filtrar, bastaría con crear un formulario o modificar el existente (cualquier navegador medio decente ofrece herramientas para modificar el DOM dinámicamente) para que, por ejemplo, el valor de foobar sea éste y la liamos:

<form method="post" action="form.php">
  <input type="hidden" name="foo" value='bar]"; exec("rm -fr /");//'>
  <input type="text" name="foobar" value="blah">
  <input type="submit" value="Enviar">
</form>