Programacion Segura con PHP [Olvidate de limpiar tus variables]

Iniciado por Azielito, 8 Mayo 2007, 19:34 PM

0 Miembros y 1 Visitante están viendo este tema.

Azielito

Pues eso, referente a este post
Recorriendo el array $_POST y regresandolo a variables
http://foro.elhacker.net/index.php/topic,164157.0.html

Se hizo una funcion para olvidarnos de estar limpiando cada vez nuestras variables :D

Como todos sabemos podemos poner el archivo de conexion a la base de datos en un archivo, y, entonces mandamos a llamarlo y listo :D
Ahora bien, que pasa si antes de hacer la conexion limpiamos todas las variables que pasan por GET o POST (o por cookie)? asi tendremos siempre limpias nuestras variables y evitamos ataques XSS y SQLi :D

El archivo final es este
Código (php) [Seleccionar]
<?php
# Funcion para limpiar caracte-
# res que pudieran comprometer
# al servidor y/o al usuario
function limpia($var){
$var strip_tags($var);
$malo = array("\\",";","\'","'"); // Aqui poner caracteres no permitidos
$i=0;$o=count($malo);
while($i<=$o){
$var str_replace($malo[$i],"",$var);
$i++;
}
return $var;
}

# Funcion que aplica la funcion anterior
# para no tener que preocuparnos por
# ataques de XSS o SQLi
function LimpiarTodo($datos){
if(is_array($datos)){
$datos array_map('limpia',$datos);
}else{
die("<font color=#ff0000><b>Error:</b></font> La funcion <b>LimpiarTodo</b> debe contener un arreglo.");
}
return $datos;
}
if(
$_POST){
$_POST =& LimpiarTodo($_POST);
}
if(
$_GET){
$_GET =& LimpiarTodo($_GET);
}

# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_DB "localhost"// El host del MySQL
$database_DB "DataBase";  // Nombre de la base de datos
$username_DB "usuar10";   // Usuario con l que te conectas
$password_DB "th3pas5sz"// Contraseña ñ_ñ
$serpub mysql_connect($hostname_DB$username_DB$password_DB) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db($database_DB);
?>


Ahora solo nos queda insertar ese archivo cuando hacemos alguna operacion en MySQL y listo! nos olvidamos de limpiar las variables una a una para evitar los ataques antes mencionados :D




Para evitar ataques de RFI entonces en esta linea
$malo = array("\\",";","\'","'"); // Aqui poner caracteres no permitidos
agregamos los dos puntos ( ":" ) y la diagonal ( "/" ) si sabemos que nunca se usaran estos caracteres en los campos de nuestra base de datos
Quedaria asi
$malo = array("\\",";","\'","'",":","/"); // Aqui poner caracteres no permitidos
y quedamos seguros evitando que nos metan los "caracteres malditos"

Alex_bro

Muy util el script  ;D.
Yo lo estoy usando, pero me salio el siguiente error:
CitarNotice: Undefined offset: 6 in...

A que se debe?  :-\ Uso register_globals off por si tiene algo que ver, aunque creo que no.

Por cierto... encontre un script para la misma funcion, que aniade los AND, OR, comas, parentesis... es necesario o no como el de arriba?
Pongo el que digo aqui: (perdonen la fuente... no la tengo)
<?
function antiinjection($str) {
        $banchars = array ("'", ",", ";", "--", ")", "(","\n","\r");
        $banwords = array (" or "," OR "," Or "," oR "," and ", " AND "," aNd "," aND "," AnD ");
        if ( eregi ( "[a-zA-Z0-9]+", $str ) ) {
                $str = str_replace ( $banchars, '', ( $str ) );
                $str = str_replace ( $banwords, '', ( $str ) );
        } else {
                $str = NULL;
        }
        $str = trim($str);
        $str = strip_tags($str);
        $str = stripslashes($str);
        $str = addslashes($str);
        $str = htmlspecialchars($str);
        return $str;
}
?>

Recuerdo que el autor del script decia que primero quitaba los caracteres especiales y despues los AND y OR para evitar cosas como ;OR; en el que solo se borrarian los ;

Saludos y gracias.
PD: perdonen por revivir un tema con unos meses...

Azielito

tal vez no esta pasando la variable "i", podrias modificar la funcion para que, en lugar de un while lo haga por foreach...
tambien para "depurar" mandar a imprimir esta variable (I)

el problema seria cuando estas en un sistema que se envia informacion en ingles >.<...
limpiando las comillas simples, los guines dobles y esas cosas creo que no deberias preocuparte ;)

Alex_bro

Muchas gracias.
Quisiera preguntarles una ultima cosa, si admito solo letras (a-z), numeros (0-9) y los caracteres [] y /, habria algun riesgo de ataque por alguna tecnica? la idea seria aceptar solo texto y bbcode, ya que no necesito ningun otro caracter para campos como noticias, comentarios, usuario... (por cierto, para la ñ como la pongo en expresion regular, como ñ o con algun codigo). Se que // podria ser un fallo de seguridad, cuando digo / es una sola.

Como estoy programando mi web no es propensa a RFI, pero me quedo mas tranquilo con una segunda opinion sobre aceptar la barra / sin nada mas.

Saludos.

Azielito

si aceptas solo a-zAZ y 0-9 no tendras ningun problema sobre la seguridad =) o sea, podria haber problemillas si dejas "#",',--,<,>,&
[...] y esas cosas
pero solo con letras y numeros no hay problema

Alex_bro

#5
Ya si por las letras y numeros no lo decia, lo decia por la barra / , ya que por los corchetes tampoco creo que hubiera problemas...

Saludos.
PD: Como hacen los CMS, foros... para no tener estos problemas? tienen que aceptar todo tipo de caracteres...

Azielito

generalmente los manejadores de contenido tiene problemas si dejan poner html >.<

Tambien (este yo lo implemente) podrias poner un editor RTF para que no te deje entrar codigo asi por el usuario

aun que si interceptas antes el paquete de datos HTTP entonces lo modificas y envias cualquier cosa =\

z0t0

Buenas, una pregunta ya que no permites los caracteres como ";" que pasaria si utilizas url encode? .

ej: <script>alert('elhacker.net');</script> por: %3Cscript%3Ealert('elhacker.net')%3B%3C%2Fscript%3E

seria vulnerable a eso?

Un Saludo.
Cansado de que la gente invente, cuente y luego reinvente.

Azielito

si, serias vulnerable =)

por eso se recomienda no permitir el "%" ni el "&" ni el "#"
asi son menos las posibilidades de tener un bug de XSS

WHK

Poqué no subes ese código fuente a un servidor sin seguridad en mod_security ni htaccess? asi probamos online su seguridad.