PHP. Evitar inyección de código.

Por un campo input un usuario puede introducir código que puede ser interpretado en el servidor sino tenemos cuidado.

La función php addslashes( string ) devuelve un string con los carateres escapados, es muy utilizada para escapar los caracteres en las sentencias SQL.

Ver su descripción en www.php.net

Otras formas de evitar que se inyecte código por los input de un formulario sería validar lo que se envía al servidor, las expresiones regulares nos pueden ayudar mucho. Evitamos que se los valores tengan caracteres especiales.

// si tiene algún caracter especial, _.!@#$&*+=|.....
if (ereg("[^A-Za-z0-9]+",$_REQUEST['user'])) {
$_MensajeError="ERROR: usuario no válido";

return $_MensajeError;
}
// si no tiene caracteres alfanuméricos
if (ereg("[^A-Za-z0-9]+",$_REQUEST['pass'])) {
$_MensajeError="ERROR: password no válida";

return $_MensajeError;
}
?>


El tema de la seguridad es muy amplio, con esto solo prevenimos ciertos ataques, por ello deberemos añadir a nuestros scripts muchísimos más controles para tener una web segura.

Comentarios

  1. También una forma sencilla es escapar las comillas simples.

    Todos los parametros de un INSERT, UPATE, SELECT, etc .. deberán ser escapados al montar la sentencia, antes de ejecutarla.

    En oracle sustiutimos la comilla simple ' por dos comillas simples '' que no es lo mismo que dobles comillas ".

    En mysql con escapar la comilla simple con \' bastaría para evitar la inyecciónd e código.

    ResponderEliminar
  2. Hola, disculpa, podrias explicarme un poquito a que te refieres con "escapar las comillas simples" para lo de mysql? Muchisimas gracias.

    ResponderEliminar
  3. El artículo está un poco anticuado, más bien obsoleto.

    Para escapar los caracteres usar en mysql:
    mysql_real_escape_string


    Para validar los campos ereg está obsoleta, usar preg_match

    preg_match




    # VALIDACIÓN

    // El usuario debe tener entre 4 o 20 caracteres y solo son válidos letras, números, el punto . y guión bajo y medio _ -
    if (!preg_match('/^[a-z0-9_.-]{4,20}$/i', $_REQUEST['user'])) {
    $errorMensaje="ERROR: usuario no válido";
    return $errorMensaje;
    }

    // Otra forma sería, si tiene algún caracter que no sea letras, números, el punto . y guión bajo y medio _ -, error
    if (preg_match('/[^a-zA-Z_\-\.]+/', $_REQUEST['user'])) {
    $errorMensaje="ERROR: usuario no válido";
    return $errorMensaje;
    }


    # ESCAPAR CARACTERES en MYSQL

    $query = sprintf("SELECT * FROM users
    WHERE user='%s' AND password='%s'",
    mysql_real_escape_string($_REQUEST['user']),
    mysql_real_escape_string($_REQUEST['password']));

    $result = mysql_query($query);

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

PHP. módulo de un "long". Calcular dígito control de IBAN.

HTML. CSS. input disabled - input readonly