Pregunta

<?php
class test_class {

        public function __construct() { 

        }
        public function doLogin($username,$password) {

            include("connection.php");

            $query = "SELECT *
                      FROM users
                      WHERE username = '".mysql_escape_string($username)."'
                      AND password = '".mysql_escape_string($password)."'";
            $result = mysql_fetch_array(mysql_query($query));
            if(!$result) {

            return 'no';
            }
            else 
                {
            return 'yes';
                }
            }


}
?>

El código anterior funciona, pero un poco preocupado si su seguro o no.

Nota: No estoy usando el método POST, así que tengo que recibirlo como argumentos en la función y no puedo usar.

if (isset($_POST['username']) && isset($_POST['password']))
        {
        $username= $_POST['username'];
        $password= $_POST['password'];
¿Fue útil?

Solución

El código podría ser seguro, pero la aplicación no es muy grande. Nunca se debe almacenar una contraseña de autenticación como texto sin formato. Debería sal y hash.

Podría pasar una hora de explicar por qué, pero le gustaría hacerlo mejor acaba de leer este .

Otros consejos

La consulta en sí parece seguro, pero si se ha utilizado una interfaz DB que admite enlace de parámetros, tales como DOP o Zend_Db, no se tendría que analizar cada sentencia SQL tan nerviosa.

Además, las funciones mysql- * son muy desaprovechado; usted debe buscar en las funciones mysqli- * en lugar.

Como nota al margen estilística, no tiene sentido en un constructor vacío, y me gustaría sugerir regresar verdadera o falsa booleana en lugar de los valores de cadena.

Por último, como se ha mencionado en otras partes, el almacenamiento de contraseñas en texto plano es una mala idea.

uhh .... Está almacenar una contraseña en texto plano? Eso no es ciertamente seguro. La contraseña debe hash con una sal de usar algo como sha256. El almacenamiento de contraseñas en texto plano no es nunca una buena idea.

No. No se debe a almacenar la contraseña de crudo en su base de datos. Almacenarlo hash (preferiblemente con una sal). Además, las declaraciones preparadas son una mejor opción que escapar. Ver este PHP DOP documentación . Como un beneficio adicional (además de la seguridad), que pueden ser más eficientes.

El código en sí se ve bien, pero el principal problema que veo es que estás pasando alrededor de las contraseñas en texto sin formato.

es la conexión de cliente a servidor seguro (es decir, usando SSL) ¿Es segura la conexión de servidor a la base de datos

Si bien en caso de que alguien pueda sentarse en el cable y ver el tráfico que pasaba, entonces usted tiene un problema de seguridad.

Si fuera yo, sin duda tienen una conexión SSL entre el cliente y el servidor.

Me aseguraba que estaba almacenando un hash de la contraseña en la base de datos.

Y me gustaría cambiar el código para algo así como

//Pseduo Code
SELECT * FROM Table where UserName = $username
Get Row Back
if(MD5Hash($password) == DataRow[Password])
   //Valid

Creo que está bien, sin embargo, si estoy preocupado por la seguridad, me gustaría almacenar la contraseña de "nombre de usuario" en la variable y compararlo exterior de consulta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top