Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Buildingsecurephpapps Es Sample PDF
Buildingsecurephpapps Es Sample PDF
Inyeccin de SQL
El mundo real
Aunque es poco probable que el nombre real de una persona
contenga cdigo SQL, este tipo de vulnerabilidad por inyec-
cin se da en el mundo real todo el tiempo:
Los detalles precisos de estas vulnerabilidades no fueron revelados, es por ello que no
podemos estar seguros que ocurrieron debido a inyeccin de SQL. Aunque en la mayora de
los casos es debido a una inyeccin.
La extensin mysql_* y sus mtodos estn deprecados oficialmente. Por favor no los
usen.
Captulo 1 - Nunca confen en los usuarios. Filtren TODAS las entradas
de datos. 4
1 mysql_query('UPDATE users
2 SET first_name="' . $_POST['first_name'] . '"
3 WHERE id=1001');
Liz", last_name="Lemon"; --
UPDATE users
SET first_name="Liz", last_name="Lemon"; --"
WHERE id=1001;
Cmo Protegerse
El requisito principal para evitar la inyeccin de SQL es la
sanitizacin (tambin conocida como escape). Podemos es-
capar cada entrada de datos individualmente o usar un mejor
mtodo llamado vinculacin de parmetros. La vinculacin
de parmetros es, en definitiva, la medida que recomiendo,
ya que ofrece mayor seguridad. El cdigo quedara de las
siguiente manera usando la clase PDO de PHP:
http://us1.php.net/manual/es/intro.pdo.php
Captulo 1 - Nunca confen en los usuarios. Filtren TODAS las entradas
de datos. 5
Asignacin Masiva
La asignacin masiva puede ser una herramienta muy til
para acelerar el desarrollo, pero tambin puede causar mucho
dao si se usa incorrectamente.
Supongamos que tenemos un modelo User el cual necesita-
mos actualizar. Podramos actualizar cada campo de forma
individual, o podramos enviar todos los cambios desde un
formulario y actualizar todos a la vez.
El formulario podra lucir del siguiente modo:
1 <form action="...">
2 <input name="first_name" />
3 <input name="last_name" />
4 <input name="email" />
5 </form>
1 $user = User::find(1);
2 $user->update(Input::all());
1 <form action="...">
2 <input type="text" name="first_name" />
3 <input type="text" name="last_name" />
4 <input type="text" name="email" />
5 <input type="hidden" name="permissions" value="{\
6 'admin':'true'}" />
7 </form>
Typecasting
Un paso adicional que deberan de considerar, no slo por
cuestiones de seguridad sino tambin de integridad de datos,
es la conversin a formatos conocidos. Ya que PHP es un
lenguaje dinmico, sus valores pueden ser de cualquier tipo:
cadena de texto, entero, flotante, etc. Al convertir un valor
podemos verificar que la informacin coincide con lo que
esperamos. En el ejemplo anterior, si el identificador proviene
de una variable tiene sentido hacer la conversin si sabemos
que siempre debe tratarse de un valor entero:
Sanitizando informacin de
salida
Desplegando informacin en el
navegador
No hay que tomar precauciones nicamente al guardar in-
formacin, hay que sanitizar / escapar cualquier informacin
generada por el usuario que vaya a mostrarse en el navegador.
Podemos modificar y escapar informacin previo a guardarla
en la base de datos o al recuperar la informacin para mostrar-
la. Normalmente depende de cmo se utilice la informacin.
Por ejemplo, si el usuario va a poder editar la informacin
posteriormente, tiene sentido guardarla tal y como es y sani-
tizarla al momento del despliegue.
Cules beneficios de seguridad se obtienen al escapar in-
formacin generada por el usuario? Supongamos que un
usuario guarda el siguiente fragmento de cdigo en nuestra
aplicacin, la cual lo guarda para mostrarlo despus.
http://us1.php.net/manual/es/function.htmlentities.php
http://us1.php.net/manual/es/function.htmlspecialchars.php
Captulo 1 - Nunca confen en los usuarios. Filtren TODAS las entradas
de datos. 14
http://us1.php.net/manual/es/function.escapeshellcmd.php
http://us1.php.net/manual/es/function.escapeshellarg.php