New question

Question:

Date: 24-01-2015 13:43:00 (In Spanish)

¿Cómo activar case sensitive para contraseña del logueo?[Resolved]

Saludos, tengo un problema, y esque los usuarios pueden ingresar con su contraseña pero en case sensitive off, osea si su clave es "JoSe" y se loguean con "jose" si se loguean, y quiero activar el case sensitive, como lo haria?

<?php

session_start(); 

include_once "conexion.php";



function verificar_login($user,$password,&$result)
{
	$sql = "SELECT * FROM usuarios WHERE nombre = '$user' and clave = '$password'";
	$rec = mysql_query($sql);
	$count = 0;
	$comp = mysql_num_rows($rec);
	if($comp>0)
	{      
	   $row = mysql_fetch_object($rec);
	   return true;
	}
	else
	{
		return false;
	} 	
}

if(!isset($_SESSION['userid'])) //para saber si existe o no ya la variable de sesión que se va a crear cuando el usuario se logee

{

    if(isset($_POST['login'])) //Si la primera condición no pasa, haremos otra preguntando si el boton de login fue presionado

    {

        if(verificar_login($_POST['user'],$_POST['password'],$result)) 
		{ 
			 $_SESSION['userid'] = $result->id;
			 $_SESSION['MM_Username'] = $_POST['user'];
			header('location: cuenta.php');
		} 
		else 
		{ 
			echo '<div class="error">Su usuario es incorrecto, intente nuevamente.</div>'; 
		} 

    }
}
?>
 


<html>
<head>
<meta charset="UTF-8">
</head>

<body 
background="fondo.jpg">

</body>
	<form action="" method="post" class="login">


		<div><label>Nombre</label><input name="user" type="text" required></div>

		<div><label>Contraseña</label><input name="password" type="password" required></div>

		<div><input name="login" type="submit" value="login" ></div>

	</form>
</html>


Como dije, el case sensitive está en off, como soluciono? otra cosa, que pasa si dejo la contraseña en texto plano? pueden usar sql inyeccion? y como lo haría?

PD: Recalco que solo yo tengo acceso a la base de datos, y solamente yo tendré el acceso.

SOLUCIONADO: La solución fue hacer una consulta sql a la base de datos y sacar la contraseña en una variable, luego esa variable compararla con la variable $_POST del texto puesto en el formulario del login con el operador ==.
Ahora quisiera saber como uso el hash crypt en varios lenguajes como php, c++ o pawn.
Tags: Case Sensitive - MySQL - Password - PHP - Question - Security - Validaciones Votes: 1 - Answers: 10 - Views: 23 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 24-01-2015 14:53:41 La validación "case sensitive" la tenes que hacer dentro de la función "verificar_login()". Como no pusiste el código de esta función no te puedo explicar mucho más, pero asumiendo que ahí dentro estas haciendo una query a la base de datos para traer un usuario que sea igual al "user" y "password", te comento:

    Nunca debes guardar la contraseña en texto plano en la base de datos, es recomendable guardar un HASH que no sea reversible (como lo es MD5). Entonces cuando el usuario se registra tu guardas en el campo "password" de la base de datos el MD5 de su contraseña y luego cuando el usuario quiere hacer login contrastas la password que llega por post convertida a MD5 con el MD5 que tienes guardado en la base de datos.

    Fijate que el MD5 de "jose" no es igual al MD5 de "JoSe":
    <?php
    echo md5('JoSe'); //706530b6e9b0dd4491f44c7bda2c1da6
    echo '<br>';
    echo md5('jose'); //662eaa47199461d01a623884080934ab
    ?>


    En cuanto a la conversión MD5 de un string, te recomiendo que lo hagas concatenado con alguna "key semilla" para evitar que alguien con acceso al MD5 pueda hacer un contraste por diccionario y obtener el texto original (recuerda que el MD5 no es reversible, la forma de saber que MD5 corresponde con que string es comparando por diccionario).

    Entonces puedes hacer esto (fijate que ahora el MD5 resultante nada tiene que ver con la contraseña original):
    <?php
    define('KEY_MD5', 'estAesMiSemiLLa4444');
    echo md5('jose'.KEY_MD5); //633f7042dfbf159e6c4987503462c683
    ?>


    Para ejemplificar lo dicho, te dejo una web que dice que puede desencriptar los MD5 (fijate que lo hace por diccionario): http://www.md5online.org/
    Si colocas ahí el MD5 "662eaa47199461d01a623884080934ab" verás que te dice que la desencripción es "jose", pero si pones el MD5 + SEMILLA 633f7042dfbf159e6c4987503462c683 no obtendrá resultado.

    Por otro lado, nunca debes trabajar directamente con los parametros que te envía el usuario (ya sea por POST o GET), debes pasar los parametros por una función de sanetización (o sea, debes limpiarlos de cualquier posible "inyección de código" antes de usarlos, compararlos y/o pasarlos a una consulta SQL.

    Saludos y buen código!
      Votes: 1 - Link answer
     
  • Date: 25-01-2015 06:01:06 Como bien dice Fernando Mosquera es recomendable utilizar un algoritmo de cifrado.
    MD5 y SHA1 son lo suficientemente inseguros como para no recomendar su uso en sistemas web donde se almacene información sensible.
    Dale un vistazo a la función hash de PHP. Yo personalmente utilizo un algoritmo poco conocido.
    Algo a considerar también es la complejidad de tus contraseñas. La regla estándar es que una contraseña segura contiene los siguientes elementos:
    1. Al menos una mayúscula.
    2. Al menos una minúscula.
    3. Al menos un caracter numérico.
    4. Al menos un caracter especial (No alfanumérico como una coma, un punto o inclusive un espacio, etc.)
    5. Una longitud de al menos 8 caracteres.

    Solo recuerda que el campo en la base de datos tenga un espacio suficiente para almacenar el hash.

    Saludos
      Votes: 2 - Link answer
     
  • Date: 25-01-2015 15:22:05 Hola, PHP es case-sensitive SIEMPRE en sus comparaciones excepto que indiques expresamente lo contrario.
    Mostrame el código de la función "verificar_login()" para checkear más a fondo.
    Con respecto al cifrado de contraseñas, te recomiendo que utilices todo tu ingenio para crear el tuyo propio. Nunca utilices codificadores por defecto porque son conocidos por otros programadores y usuarios malintencionados nunca faltan, y si a eso le sumás que saben programar, es un riesgo de seguridad.
    Crea tu propio codificador y decodificador de cadenas. Uno que sea totalmente impredecible, confuso para cualquiera. Podés ayudarte de md5 si querés, pero no contés únicamente con eso.

    Saludos, espero el código de la función que falta para terminar de ayudarte.
      Votes: 1 - Link answer
     
  • Date: 26-01-2015 11:20:14 Saludos y gracias por todo, arriba está detallado todo, y algo que quisiera saber es, ¿Que desventaja tiene en que deje la contraseña en texto plano?   Votes: 0 - Link answer
     
  • Date: 28-01-2015 06:27:44 Jose, el problema de dejar la contraseña en texto plano es que si alguien vulnera tu aplicación se va a estar llevando la contraseña de todos los usuarios, lo cual suele ser un problema sabiendo que la mayoría de los usuarios utilizan la misma contraseña en casi todos los sitemas (lo idea es garantizar que nadie pueda ver esas contraseñas, ni siquiera tu). Por medio del ejemplo que te doy de utilizar MD5 en combinación con una KEY ya esta más cerca de cumpliendo con este punto, aunque mejor es utilizar la API de hash de contraseñas nativa. Con la documentación oficial puedes extender el concepto, aquí te dejo el link: http://php.net/manual/es/book.password.php

    También en el manual de PHP podras encontrar algunas preguntas frecuentes (FAQ) como:

    ¿Por qué debo usar hash en las contraseñas de los usuarios de mi aplicación?

    El hash de contraseñas es una de las consideraciones de seguridad más elementales que se deben llevar a la práctica al diseñar una aplicación que acepte contraseñas de los usuarios. Sin hashing, cualquier contraseña que se almacene en la base de datos de la aplicación podrá ser robada si la base de datos se ve comprometida, con lo que inmediatamente no sólo estaría comprometida la aplicación, sino también las cuentas de otros servicios de nuestros usuarios, siempre y cuando no utilicen contraseñas distintas.

    Si aplicamos un algoritmo hash a las contraseñas antes de almacenarlas en la base de datos, dificultamos al atacante el determinar la contraseña original, pese a que en un futuro podrá comparar el hash resultanente con la contraseña original.

    Sin embargo, es importante tener en cuenta que el hecho de aplicar hash a las contraseñas sólo protege de que se vean comprometidas las contraseñas almacenadas, pero no las proteje necesariamente de ser interceptadas por un código malicioso inyectado en la propia aplicación.


    ¿Por qué las funciones hash más comunes como md5() y sha1() no son adecuadas para las contraseñas?

    Los algoritmos hash como MD5, SHA1 o SHA256 están diseñados para ser muy rápidos y eficientes. Con las técnicas y equipos modernos, es algo trivial extraer por fuerza bruta la salida de estos algoritmos, para determinar los datos de entrada originales.

    Dada la velocidad con que los ordenadores actuales pueden "invertir" estos algoritmos hash, muchos profesionales de la seguridad recomiendan encarecidamente no utilizarlas como funciones hash para contraseñas.


    ¿Qué hash debo aplicar a mis contraseñas, si las funciones hash más comunes no son adecuadas?

    Al aplicar un algoritmo hash, los dos factores más importantes son el coste computacional y la sal. Cuanto más cueste aplicar un algoritmo hash, más costará analizar su salida por fuerza bruta.

    PHP 5.5 proporciona una API de hash de contraseñas nativa que maneja cuidadosamente el empleo de hash y la verificación de contraseñas de una manera segura. También hay una » biblioteca de compatibilidad de PHP pura disponible para PHP 5.3.7 y posterior.

    Otra opción es la función crypt(), la cual tiene soporte para varios algoritmos hash en PHP 5.3 y posterior. Al emplear esta función, se garantiza que el algoritmo que se seleccione esté disponible, debido a que PHP contiene implementaciones nativas de cada algoritomo soportado, en caso de que el sistema no tenga soporte para uno o más de estos algoritmos.

    El algoritmo recomendado para el empleo de contraseñas con hash es Blowfish, que es también el predeterminado de la API de hash de contraseñas, que, aunque es significativamente más caro computacionalmente que MD5 o SHA1, sigue siendo escalable.

    Observar que si se emplea crypt() para verificar una contraseña, será necesario tomar precauciones para evitar ataques de temporización utilizando una comparación de string de tiempo constantes. Ni los operadores == y === de PHP ni strcmp() llevan a cabo una comparación de string de tiempo constante. Debido a que password_verify() hará esto de forma automática, se recomienda el empleo de la API de hash de contraseñas nativa siempre que sea posible.

    Fuente: http://php.net/manual/es/faq.passwords.php

    Espero haber contestado a tu pregunta (si es así vota las respuestas que te ayudaron a dilucidar el tema y cambia el estado del titulo).

    Saludos y buen código!
      Votes: 1 - Link answer
     
  • Date: 28-01-2015 07:27:42 Gracias amigo, pero la cuestion es como crifo desde mi servidor sa-mp, en pawn como sería esa es la cosa, me gusta la idea de usar crypt he averiguado y es mejor que md5 y SHA1 pero si uso crypt como usaría en el lenguaje pawn, quisiera saber la funcion de crypt. Me puedes ayudar?   Votes: 0 - Link answer
     
  • Date: 28-01-2015 09:06:56 Creo que lo que planteas escapa a la pregunta original sobre contraseña "case sensitive", lo que te sugiero que hagas es cargar una nueva pregunta tratando de ser lo más especifico y claro posible (en tu comentario estas realizando varias preguntas es una, es un poco confuso).

    Volviendo al tema de la pregunta original, algo que me gustaría agregar sobre el script que publicaste es que la forma en que estas trabajando es muy insegura, tu código es completamente inyectable, tienes que sanitizar las variables $_POST['user'] y $_POST['password'] antes de usarlas.

    Por otro lado, suponiendo que quieras dejar la password en texto plano, puedes modificar el SELECT agregando la directiva COLLATE junto con una collation binaria para que la comparación sea case sensitive.

    Para tu ejemplo (suponiendo que el juego de caracteres usado es UTF8):
    $sql = "SELECT * FROM usuarios WHERE nombre = '$user' and clave = '$password'  COLLATE utf8_bin";


    Al agregar "COLLATE utf8_bin" se le indica a SQL que el cotejamiento de la columan "clave" sea case sensitive.

    Saludos y buen código!
      Votes: 1 - Link answer
     
  • Date: 28-01-2015 10:59:08 Muchisisisismas gracias, sobre el cifrado si, voy hacer otro post indicando claramente lo que necesito para cifrar las contraseñas, ya que no me conviene que se guarde en texto plano, y sobre lo de satinar como es eso? me puedes explicar como satino? usando echo filter_var(? http://www.phpro.org/tutorials/Filtering-Data-with-PHP.html   Votes: 0 - Link answer
     
  • Date: 29-01-2015 04:20:08 Sanitizar variable: limpiar/desinfectar de cualquier inyección de código tu variable, por ejemplo para sanitizar una variable del tipo integer, puedes hacer una función como esta:

    function sanitizarInt($valor){
        if(is_int($valor)){
            //si el valor informado es integer, se retorna sin problemas
            return $valor;
        }else{
            //si no es integer, se hace un casting a integer, si no puedes hacer el casting devuelve 0
            return (int)$valor;
        }
    }


    Si pasas tu variable por la función anterior, te garantizas que siempre vas a obtener un integer (nunca un string y/o código), entonces harías algo así:

    $productoId = (isset($_GET['id']))?$_GET['id']:0; //<-- recordemos que esto es un if ternario
    $productoId = sanitizarInt($productoId); //<-- limpio mi variable
    if($productoId>0){ //<-- compruebo que sea un id valido
        echo 'el producto id esta ok';
    }else{
        echo 'producto id invalido';
    }
    


    Para los strings el cielo es el limite, ya que puedes hacer una función de sanitizarString($valor) tan compleja como necesites, por ejemplo prodías usar expresiones regulares para solo permitir que el string tenga caracteres del alfabeto español y que no soporte caracteres especiales, o si (eso dependerá de lo que quieras hacer).

    Saludos y buen código.
      Votes: 1 - Link answer
     
  • Date: 29-01-2015 14:06:02 A ya entendí, tambien estuve leyendo en unas enciclopledias y me di cuenta que es simplemente para asegurarse de que esa variable tenga el codigo necesario para funcionar, asi limpiando de otros codigos basura por asi decirlo, una pregunta, y no es lo mismo haciendo lo siguiente?

    <div><label>Nombre:</label><input name="user" type = "text" title="Ingresa tus nombres con el guion '_'." required pattern='[A-Za-z]{3,24}' required></div>
    


    Allí estoy indicando que solo en ese campo puede escribir de a-z y mayuscula A-Z con minimo de 3 caracteres y maximo 24
      Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In