Question

<?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';
                }
            }


}
?>

Le code ci-dessus fonctionne, mais un peu inquiet que sa sécurité ou non.

Note: Je ne suis pas en utilisant la méthode POST, donc je dois le recevoir comme arguments dans la fonction et je ne peux pas utiliser.

if (isset($_POST['username']) && isset($_POST['password']))
        {
        $username= $_POST['username'];
        $password= $_POST['password'];
Était-ce utile?

La solution

Le code peut être sécurisé, mais la mise en œuvre n'est pas grande. Vous ne devez jamais stocker un mot de passe d'authentification en texte clair. Vous devez le sel et le hachage il.

Je pourrais passer une heure à expliquer pourquoi, mais vous feriez mieux simplement lire ce .

Autres conseils

La requête elle-même apparaît sécurisée, mais si vous utilisez une interface DB qui a soutenu la liaison des paramètres, tels que AOP ou Zend_Db, vous ne devez examiner chaque instruction SQL tout à fait si nerveusement.

En outre, les fonctions * sont mysql à peu près dépréciée; vous devriez regarder les fonctions mysqli- * au lieu.

Comme une note de côté stylistique, il n'y a pas de point dans un constructeur vide, et je vous suggère que les valeurs de chaîne retour true ou false booléen plutôt.

Enfin, comme mentionné ailleurs, le stockage des mots de passe est une mauvaise plaintext idée.

uhh .... vous stockez un mot de passe en texte clair? C'est certainement pas sûr. Le mot de passe doit être haché avec un sel en utilisant quelque chose comme SHA256. Le stockage des mots de passe en clair est jamais une bonne idée.

Non. Vous ne devriez pas stocker le mot de passe dans votre base de données brutes. Conservez-haché (de préférence avec un sel). En outre, les déclarations préparées sont un meilleur choix que de s'échapper. Voir cette documentation PHP PDO . Comme un avantage supplémentaire (en plus de la sécurité), ils peuvent être plus efficaces.

Le code lui-même semble ok, mais la question principale que je vois est que vous les mots de passe passe autour en texte brut.

est la connexion client-serveur sécurisé (à savoir en utilisant SSL) La connexion est serveur à base de données sécurisée

Si dans les deux cas, quelqu'un peut s'asseoir sur le fil et de regarder le trafic qui passe, alors vous avez un problème de sécurité.

Si elle était moi, je l'aurais certainement une connexion SSL entre le client et le serveur.

Je vous assure que le stockage d'un hachage du mot de passe dans la base de données.

Et je changerais votre code à quelque chose comme

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

Je pense qu'il est OK, mais, si je suis inquiet pour la sécurité, je stocker le mot de passe « nom d'utilisateur » dans la variable et le compare à l'extérieur de la requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top