Filtros genéricos y la seguridad

Hace algún tiempo ya había comentado que este tipo de funciones en general son de poca utilidad y dan una falsa sensación de seguridad a los que las usan.

php:
function antiinjection($str) {
        $banwords = array ("'", ",", ";", "--", " or ", ")", "(", " OR ", " and ", " AND ","\n","\r");
        if ( eregi ( "[a-zA-Z0-9]+", $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;
}

¿Qué problemas le encuentran al código mostrado?

10 Replies to “Filtros genéricos y la seguridad”

  1. yo haria

    code:

    function antiinjection($str) {
            $banchars = array ("'", ",", ";", "--", ")", "(","\n","\r");
            $banwords = array (" or "," OR "," Or "," oR "," and ", " AND "," aNd "," aND "," AnD "); //faltan algunas permutaciones del and,se sobreentiende espero gracias a la observacion del primero comentario
            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;
    }
     

    El orden de aplicar str_replace es estrictamente ese, primero escapo los caracteres peligrosos y despues quito los and y or. Y aun asi seguro que queda algun bug por ahi.

    El orden estricto en que aplico los replaces es para evitar por ejemplo ;OR; que en el ejemplo, solo quitaria los ;

    De esta forma por ejemplo Select user from users where id=2 ;OR; 1=1 quedaria:

    Despues del primer replace: Select user from users where id=2 OR 1=1
    Y en el segundo replace, pues ya se quitaria el or, teniendo un sql mal formado pero polo menos no devuelve algo indeseado: Select user from users where id=2 1=1

    Presupongo que se va a hacer un select, porque si vas a hacer un insert o un update, claro, no te vas a cargar lo que escribe alguien. Si lo que insertas o modificas no va a meterse como enlace en href, en principio con hacer lo de stripslashes y eso llegaria pienso yo.

  2. Tal como mencionas, tanto en el código original como en el que modificaste, todavía quedan varios problemas, por ejemplo falla para el siguiente valor: 1 <>OR<> 1=1.

    En fin, me parece que el que escribió esa función no se dió cuenta de lo que estaba haciendo.

  3. Perdonad... pero... ¿nadie ve que es una imprudencia jugar con las consultas de SQL? Yo lo tengo claro... a mi que se me dejen de inventos raros con funciones chungas y que se pongan todos a usar mysqli y consultas parametrizadas.

    Todavía no tengo ni una sola razón por lo que no sea recomendable usarlo.

  4. Completamente de acuerdo DN, pero el motivo por el que existen este tipo de funciones, es consecuencia del craso error que cometieron los desarrolladores de PHP al no incluir el soporte para consultas parametrizadas desde las primeras versiones de este lenguaje.

    Saludos
    PS. Yo no inventé esa función 🙂

  5. Jejeje ya se que no es tuya 😉

    Pero estas funciones en general valen para lo mismo que las magic quotes: Dar falsas esperanzas con la seguridad.

  6. je, tienes razon, se me habia escapado lo de htmlchars, de todas formas, si es un texto se supone que va entre comillas no? ¿No seria mas sensto usar tambien mysql_real_escapte o algo asi se llama la funcion? A mi me queda claro que tiene muchos contras.

  7. Por cierto... ¿existe alguna librería o clase que unifique todas las funciones de acceso a datos? De una forma un poco más sencilla (Si es posible) que las del propio PHP.

    Es que llamar así a pelo a las funciones de mysqli me da un noseque, y todas las que vi usan las funciones "clásicas" de acceso a mySQL de PHP

  8. Hmm, no soy experto ni desarrollo en PHP 🙂 pero escuché buenos comentarios de PDO, aunque no sé si a eso te referías.

    Saludos

Comments are closed.