PDA

Ver la versión completa : Como protegerme de SQL injection y XSS



shairva
29-04-2012, 18:57
Hola señores, cual es la mejor forma de protegerme frente a estos ataques en PHP ?

Estoy usando la librería PDO para hacer todo el tema de la conexión, consultas, inserción ...

Gracias.

Cypress
29-04-2012, 23:42
Usando las mejores prácticas para programación
http://www.odi.ch/prog/design/php/guide.php

Saludos,

hystd
30-04-2012, 01:06
Escribe algún fragmento de código que consideres vulnerable y la respuesta será más sencilla para indicarte las pautas a seguir.

shairva
30-04-2012, 12:45
que opinas de este método para PHP?

consiste en comprobar si los caracteres que introducimos en los campos de formularios se encuentran todos en una lista (a-zA-Z0-9), y en caso de que algun caracter no aparezca en esa lista lanzamos el error y no ejecutamos la consulta/inserción ...

Qué opinas ??? crees que esto me mantendrá a salvo ?



function comprobar_nombre_usuario($nombre_usuario){
//compruebo que el tamaño del string sea válido.
if (strlen($nombre_usuario)<3 || strlen($nombre_usuario)>20){
echo $nombre_usuario . " no es válido<br>";
return false;
}

//compruebo que los caracteres sean los permitidos
$permitidos = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789";
for ($i=0; $i<strlen($nombre_usuario); $i++){
if (strpos($permitidos, substr($nombre_usuario,$i,1))===false){
echo $nombre_usuario . " no es válido<br>";
return false;
}
}
echo $nombre_usuario . " es válido<br>";
return true;
}

hckr
30-04-2012, 19:09
que opinas de este método para PHP?

consiste en comprobar si los caracteres que introducimos en los campos de formularios se encuentran todos en una lista (a-zA-Z0-9), y en caso de que algun caracter no aparezca en esa lista lanzamos el error y no ejecutamos la consulta/inserción ...

Qué opinas ??? crees que esto me mantendrá a salvo ?

A mí me parece más efectivo controlar lo que el usuario introduce, por lo tanto restringir sólo los caracteres que podrían ser peligrosos (comillas, signos de etiquetas...etc). Con tu código, el usuario no podrá introducir caracteres como la @, las barras / o \ o caracteres como $,#,(),?,¿....etc.

Un saludo.

hystd
30-04-2012, 22:21
Ok...

Tu función parece que no cumple la seguridad que esperas y es vulnerable a un XSS. Para el caso de que la función devuelve "false", al ejecutar en cualquiera de los dos casos de los if, la línea:


echo $nombre_usuario . "no valido<br>";

Estás representando en pantalla lo que el usuario ha escrito. En este caso, si el valor de la variable $nombre fuera:


<script>alert('hola');</script>

Efectivamente, la función devuelve "false", pues la longitud es superior a 20, y además la variable $nombre_usuario, contiene caracteres: <, > (, ', ;, /, que no están permitidos por tu función, pero sin embargo, está mostrando el mensaje "hola" en el navegador.

Corrigiendo este defecto, parece que cumple con asegurar ante ataques SQL injections y XSS para el parámetro $nombre_usuario, en cierta medida, pero sólo le bastaría añadir a la cadena de $permitidos, los caracteres comentados (<, >, /, -, ', +, etc...), por una simple cuestión de requisitos de la aplicación y la seguridad que has implementado no será la que esperas, siendo por tanto vulnerable a cualquier inyección de código, logrando que un atacante pueda llevar a cabo otros muchos ataques.

Un saludo.

chewarrior
01-05-2012, 17:10
Lo suyo seria sustituir o eliminar los caracteres peligrosos que puedan introducir algun usuario malintencionado, hay una funcion muy util llamada str_replace y str_ireplace para trabajar con arrays, q de seguro te sera util.

De todas fomas si borras el echo $nombre_usuario, desapareceria el XSS.