Frage

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


}
?>

Der obige Code funktioniert, aber etwas besorgt, ob ihre sichere oder nicht.

Hinweis: Ich bin nicht POST-Methode, so habe ich es als Argumente in der Funktion zu erhalten, und ich kann nicht verwendet werden.

if (isset($_POST['username']) && isset($_POST['password']))
        {
        $username= $_POST['username'];
        $password= $_POST['password'];
War es hilfreich?

Lösung

Der Code könnte sicher sein, aber die Umsetzung ist nicht groß. Sie sollten nie ein Authentifizierungs-Passwort als Nur-Text speichern. Sie sollten Salz und Hash es.

Ich konnte eine Stunde lang zu erklären, warum, aber Sie würden besser nur das Lesen dieser .

Andere Tipps

Die Abfrage selbst scheint sicher, aber wenn Sie eine DB-Schnittstelle verwendet, die unterstützt Parameterbindung, wie PDO oder Zend_Db, würden Sie nicht jede SQL-Anweisung ganz so nervös prüfen müssen.

Auch sind die mysql- * Funktionen ziemlich veraltet; Sie sollten stattdessen an den mysqli- * Funktionen aus.

Als stilistische Seite beachten, gibt es keinen Punkt in einem leeren Konstruktor, und ich würde vorschlagen, boolean wahr oder falsch eher als String-Werte zurück.

Schließlich, wie an anderer Stelle erwähnt, Klartext-Passwörter zu speichern ist eine schlechte Idee.

uhh .... Sie ein Text-Kennwort zu speichern? Das ist sicherlich nicht sicher. Das Passwort sollte mit einem Salz gehasht wird so etwas wie sha256 verwenden. Klartext-Passwörter zu speichern ist nie eine gute Idee.

Nein. Sie sollen nicht das rohe Passwort in Ihrer Datenbank werden zu speichern. Speichern sie (vorzugsweise mit einem Salz) gehasht. Ferner sind bereit, Aussagen eine bessere Wahl als zu entkommen. Sehen Sie diese PHP PDO Dokumentation . Als zusätzlicher Vorteil (neben Sicherheit), können sie effizienter sein.

Der Code selbst sieht ok, aber das Hauptproblem ich sehe, ist, dass Sie Passwörter um in Plain Text vorbei sind.

wird die Client-zu-Server-Verbindung sicher (das heißt unter Verwendung von SSL) Ist der Server-zu-Datenbank-Verbindung sichern

Wenn in jedem Fall, dass jemand auf dem Draht sitzt und beobachtet Verkehr ging durch, dann haben Sie ein Sicherheitsproblem bekommen.

Wenn es nach mir ginge, würde ich auf jeden Fall eine SSL-Verbindung zwischen dem Client und Server.

Ich würde sicherstellen, dass Sie einen Hash des Passworts in der Datenbank wurden zu speichern.

Und ich würde Ihren Code so etwas wie

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

Ich denke, es ist in Ordnung, aber wenn ich um die Sicherheit besorgt bin, habe ich das Passwort von „username“ in Variablen speichern würde und es außerhalb der Abfrage vergleichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top