elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Logins seguros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Logins seguros  (Leído 4,431 veces)
ElInquisidor

Desconectado Desconectado

Mensajes: 97


¿Vivo o muerto? Mejor simplemente Muerto


Ver Perfil
Logins seguros
« en: 17 Mayo 2016, 18:29 pm »

Alguien sabe como se debe proceder :huh: :huh: :huh: :huh: :huh: :huh: :huh: :huh: :huh: :huh: :huh: para hacer un login super seguro


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Logins seguros
« Respuesta #1 en: 17 Mayo 2016, 18:47 pm »

Las claves comparlas en sha y los usernames pasalos a la db en base64 o sha puedes hacer

Código
  1. SELECT * FROM usuarios WHERE base64(USER)=$u AND pass=$p
  2.  


Y el PHP
Código
  1. $u = base64_encode ($user);
  2. $p= sha2($pass );
  3.  

Esto lo que hara es convertir el usuario a base64 y le dirá a la db que compare con los usuarios convertidos en base64  (esto consume algo de procesador asi que puedes precompilar) y pasa las pass como hashes, esto destruye casi absolutamente  las posibilidades de una inyeccion


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
ElInquisidor

Desconectado Desconectado

Mensajes: 97


¿Vivo o muerto? Mejor simplemente Muerto


Ver Perfil
Re: Logins seguros
« Respuesta #2 en: 26 Mayo 2016, 01:03 am »

no hay algo mas elaborado  :silbar:
En línea

Pablo Videla


Desconectado Desconectado

Mensajes: 2.274



Ver Perfil WWW
Re: Logins seguros
« Respuesta #3 en: 26 Mayo 2016, 01:11 am »

Aqui tienes algo super elaborado.

https://github.com/PHPAuth/PHPAuth
En línea

daniela Vega

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Logins seguros
« Respuesta #4 en: 30 Mayo 2016, 21:49 pm »

x
« Última modificación: 4 Julio 2016, 21:13 pm por daniela Vega » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Logins seguros
« Respuesta #5 en: 30 Mayo 2016, 22:45 pm »

daniela Vega Al publicar código debes usar las etiquetas GeSHi

por otro lado tu metodo es una forma facil que te hagan un DoS


primero ya no debes usar en php la extensión mysql, ya que está obsoleta, debes usar mysqli o mysql pdo...

segundo al hacer "SELECT user,pass FROM user", te estás trayendo toda la tabla, si son miles de usuarios te ocupará la ram y tiempo de ejecución se notará facilmente y su varios usuarios simplemente llaman maliciosamente (ni si quiera necesitan enviar datos porque no comprobaste primero) te van a tumbar el site
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
el-brujo
ehn
***
Desconectado Desconectado

Mensajes: 21.586


La libertad no se suplica, se conquista


Ver Perfil WWW
Re: Logins seguros
« Respuesta #6 en: 31 Mayo 2016, 12:44 pm »

daniela Vega ese código a parte de malo es muy viejo.

Ahora se usa el conector mysqli, no mysql

Ejemplos:

Código
  1. $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
  2. $stmt->bind_param('s', $name);
  3.  
  4. $stmt->execute();
  5.  
  6. $result = $stmt->get_result();
  7. while ($row = $result->fetch_assoc()) {
  8.    // do something with $row
  9. }
  10.  


Código
  1. <?php
  2.    $mysqli = new mysqli("server", "username", "password", "database_name");
  3.  
  4.    // TODO - Check that connection was successful.
  5.  
  6.    $unsafe_variable = $_POST["user-input"];
  7.  
  8.    $stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)");
  9.  
  10.    // TODO check that $stmt creation succeeded
  11.  
  12.    // "s" means the database expects a string
  13.    $stmt->bind_param("s", $unsafe_variable);
  14.  
  15.    $stmt->execute();
  16.  
  17.    $stmt->close();
  18.  
  19.    $mysqli->close();
  20. ?>


Código
  1. $name = $_GET['username'];
  2.  
  3. if ($stmt = $mysqli->prepare("SELECT password FROM tbl_users WHERE name=?")) {
  4.  
  5.    // Bind a variable to the parameter as a string.
  6.    $stmt->bind_param("s", $name);
  7.  
  8.    // Execute the statement.
  9.    $stmt->execute();
  10.  
  11.    // Get the variables from the query.
  12.    $stmt->bind_result($pass);
  13.  
  14.    // Fetch the data.
  15.    $stmt->fetch();
  16.  
  17.    // Display the data.
  18.    printf("Password for user %s is %s\n", $name, $pass);
  19.  
  20.    // Close the prepared statement.
  21.    $stmt->close();
  22.  
  23. }


Código
  1. <?php
  2.  
  3. /**
  4.  * Check if the 'id' GET variable is set
  5.  * Example - http://localhost/?id=1
  6.  */
  7. if (isset($_GET['id'])){
  8.  $id = $_GET['id'];
  9.  /**
  10.    * Validate data before it enters the database. In this case, we need to check that
  11.    * the value of the 'id' GET parameter is numeric
  12.    */
  13.   if ( is_numeric($id) == true){
  14.    try{ // Check connection before executing the SQL query
  15.      /**
  16.        * Setup the connection to the database This is usually called a database handle (dbh)
  17.        */
  18.      $dbh = new PDO('mysql:host=localhost;dbname=sql_injection_example', 'dbuser', 'dbpasswd');
  19.  
  20.      /**
  21.        * We are going to use PDO::ERRMODE_EXCEPTION, to capture errors and write them to
  22.        * a log file for later inspection instead of printing them to the screen.
  23.        */
  24.      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  25.  
  26.      /**
  27.        * Before executing our SQL statement, we need to prepare it by 'binding' parameters.
  28.        * We will bind our validated user input (in this case, it's the value of $id) to our
  29.        * SQL statement before sending it to the database server.
  30.        *
  31.        * This fixes the SQL injection vulnerability.
  32.        */
  33.      $q = "SELECT username
  34.          FROM users
  35.          WHERE id = :id";
  36.      // Prepare the SQL query
  37.      $sth = $dbh->prepare($q);
  38.      // Bind parameters to statement variables
  39.      $sth->bindParam(':id', $id);
  40.      // Execute statement
  41.      $sth->execute();
  42.      // Set fetch mode to FETCH_ASSOC to return an array indexed by column name
  43.      $sth->setFetchMode(PDO::FETCH_ASSOC);
  44.      // Fetch result
  45.      $result = $sth->fetchColumn();
  46.      /**
  47.        * HTML encode our result using htmlentities() to prevent stored XSS and print the
  48.        * result to the page
  49.        */
  50.      print( htmlentities($result) );
  51.  
  52.      //Close the connection to the database
  53.      $dbh = null;
  54.    }
  55.    catch(PDOException $e){
  56.      /**
  57.        * You can log PDO exceptions to PHP's system logger, using the Operating System's
  58.        * system logging mechanism
  59.        *
  60.        * For more logging options visit http://php.net/manual/en/function.error-log.php
  61.        */
  62.      error_log('PDOException - ' . $e->getMessage(), 0);
  63.      /**
  64.        * Stop executing, return an 'Internal Server Error' HTTP status code (500),
  65.        * and display an error
  66.        */
  67.      http_response_code(500);
  68.      die('Error establishing connection with database');
  69.    }
  70.   } else{
  71.    /**
  72.      * If the value of the 'id' GET parameter is not numeric, stop executing, return
  73.      * a 'Bad request' HTTP status code (400), and display an error
  74.      */
  75.    http_response_code(400);
  76.    die('Error processing bad or malformed request');
  77.   }
  78. }

Y se debería usar en las sentencias SQL el parámetro LIMIT 1.

Recuerda deshabilitar  las "emulated prepared statements"

Código
  1. $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Recuerda que a partir de PHP 5.5.0 la función mysql_real_escape_string ya no existen y se debe usar la función :

mysqli::escape_string

Tienes más ejemplos con SMF 2.1 (BETA) que ya usa bcrypt para cifrar las contraseñas.

http://php.net/manual/es/security.database.sql-injection.php
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

Hashes con salt

Los hashes con salt, son como los hashes de toda la vida pero con unplus de seguridad. En este caso el truco está en la salt que se le agrega. Salt es un número de dígitos aleatorios que se le agrega al hash ya sea al principio o al final. Con lo que los hashes ya no son los normales y por ende no figurarán en una tabla haciendo más dificil  crackearlos. Ya que se deberá probar no solo con cada hash, sino tambien con cada salt y sus combinaciones.

Las funciones de hash más conocidas y utilizadas eran MD5 y SHA-1, pero dado que MD5 y SHA-1 han sido comprometidas, actualmente se recomienda el uso de nuevas funciones como son SHA-2 y Bcrypt.

El hecho de que los hashes sin salt no se combinaran con un valor "único" (salt) para que cada cuenta, hace que el proceso de crackeo sea mucho más rápido ya que requiere menos cálculo.

Gracias al "salt", garantiza que cada hash almacenado es único, incluso si dos usuarios eligen la misma contraseña de acceso, cada uno de hash en una tabla comprometida debe ser crackeada por separado.


La nueva API para codificar contraseñas de PHP 5.5

Internamente la API utiliza la función crypt() y está disponible desde la versión 5.5.0 de PHP. Si utilizas una versión anterior de PHP, siempre que sea igual o superior a 5.3.7, existe una librería con las mismas funcionalidades que la nueva API: github.com/ircmaxell/password_compat.

La función más importante de la nueva API es password_hash(), que codifica la contraseña que le pases con el algoritmo indicado

El primer argumento de la función es la contraseña original sin codificar y el segundo argumento debe ser una de las dos siguientes constantes

- PASSWORD_DEFAULT, codifica la contraseña utilizando el algoritmo bcrypt y el resultado es una cadena de 60 caracteres de longitud, cuyos primeros caracteres son $2y$10$. El algoritmo utilizado y la longitud de la contraseña codificada cambiarán en las próximas versiones de PHP, cuando se añadan algoritmos todavía más seguros. Si guardas las contraseñas en una base de datos, la recomendación es que reserves 255 caracteres para ello y no los 60 que se pueden utilizar actualmente.
- PASSWORD_BCRYPT, a pesar de su nombre, codifica la contraseña utilizando el algoritmo CRYPT_BLOWFISH. Al igual que en el caso anterior, la contraseña codificada ocupa 60 caracteres en total, siendo los primeros caracteres $2y$.

El tiempo empleado en codificar una contraseña se denomina "coste" y se puede configurar mediante el tercer argumento opcional de la función password_hash(). El coste por defecto es 10 (por eso el prefijo de las contraseñas anteriores es $2y$10$) y su valor debe estar comprendido entre 04 y 31.


http://php.net/manual/es/function.password-hash.php
« Última modificación: 31 Mayo 2016, 18:48 pm por el-brujo » En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: Logins seguros
« Respuesta #7 en: 31 Mayo 2016, 14:34 pm »

En el siguiente articulo se pueden encontrar una serie de pasos a seguir para almacenar las contraseñas de manera segura, es algo avanzado y requiere un mínimo de conocimientos.

Pero creo que es igual o más importante el como se envian:

A mí por ejemplo no me gusta que las contraseñas salgan del cliente en texto plano, por eso las hasheo con javascript. Ya sé que hay tablas, por eso, el hash también se puede saltear, aunque estoy pensando en una una manera segura de conseguir hacer esto (de que no se sepa el salt que uso en el cliente). Cuanto más largo el salt, más cuesta saltear las tablas (yo lo hasheo así ambos, hash y salt, tienen 128 caracteres).

Una vez solucionado el anterior problema, ya nadie conoceria la contraseña del usuario, pero, en caso de robarle el hash podria loguear... Este es el segundo problema que surge a la hora de proteger las contraseñas. Y el primero en caso de no hashear en el cliente. No tengo en cuenta ssl porque esto es un "worst-case scenario"  ;D.

Se aceptan sugerencias  :rolleyes:
En línea

hectornunezrivas

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Re: Logins seguros
« Respuesta #8 en: 4 Julio 2016, 06:08 am »

Hola buenas noches.
Para hacer un login seguro pues involucra muchas cosas como cifrar passwords y las sesiones por ejemplo. te paso un link el cual te puede ayudar.
http://blackbe.lt/php-secure-sessions/
Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Configurando Servidores DNS seguros
Tutoriales - Documentación
el-brujo 1 16,691 Último mensaje 7 Enero 2003, 22:38 pm
por Lolaine
ayuda ¿como crar logins en vb??
Programación Visual Basic
cobra_90 6 1,925 Último mensaje 4 Abril 2006, 03:35 am
por cobra_90
[Código-Python]Bruteforce logins - JaAViEr (0000x5d)
Scripting
0x5d 0 1,736 Último mensaje 20 Marzo 2013, 21:31 pm
por 0x5d
Servidores VPN seguros ??
Seguridad
skan 0 2,262 Último mensaje 4 Octubre 2013, 17:38 pm
por skan
Juegos en javascript ¿Seguros?
Dudas Generales
Sapote 1 1,593 Último mensaje 18 Abril 2017, 05:30 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines