Frage

Wie gefährlich ist dieser PHP-Code? Was kann dagegen getan werden?

$name = $_POST["user"];
$pwd = $_POST["pwd"];
$query = "SELECT name,pwd FROM users WHERE name = '$name' AND pwd = '$pwd'";
War es hilfreich?

Lösung

Mögliche Probleme:

  1. SQL Injection
  2. XSS Injection (wenn dieser Code eine INSERT-Abfrage ist, wäre es ein bestimmtes Problem sein)
  3. Plain Text Passwort

Ihre SQL-Anweisung kann problematisch sein. Es ist eine schlechte Praxis, sich für SQL-Injection offen zu lassen.

SQL Injection ist schlecht . Vertrauen Sie mir.

Wenn Sie die $ user auf einer HTML-Seite angezeigt werden soll, dann möchten Sie vielleicht nicht die Fähigkeit, für die Menschen gehören zu „hacken“ Ihr Layout von in Befehle eingeben wie

<H1>HI MOM</H1>

oder ein Bündel von javascript .

Auch speichern niemals Ihr Passwort im Klartext (guten Fang cagcowboy!). Es gibt zu viel Macht, um Menschen verabreicht wird (oder Hacking) Ihre Datenbank. Sie sollten nie brauchen, um jemand das Passwort kennen.

Versuchen Taktik wie diese:

// mostly pulled from http://snippets.dzone.com/posts/show/2738
function MakeSafe($unsafestring) 
{
    $unsafestring= htmlentities($unsafestring, ENT_QUOTES);

    if (get_magic_quotes_gpc()) 
    { 
        $unsafestring= stripslashes($unsafestring); 
    }

    $unsafestring= mysql_real_escape_string(trim($unsafestring));
    $unsafestring= strip_tags($unsafestring);
    $unsafestring= str_replace("\r\n", "", $unsafestring);

    return $unsafestring;
} 

// Call a function to make sure the variables you are 
// pulling in are not able to inject sql into your 
// sql statement causing massive doom and destruction.

$name = MakeSafe( $_POST["user"] );
$pwd = MakeSafe( $_POST["pwd"] );

// As suggested by cagcowboy: 
// You should NEVER store passwords decrypted.
// Ever.  
// sha1 creates a hash of your password
// pack helps to shrink your hash
// base64_encode turns it into base64
$pwd = base64_encode(pack("H*",sha1($pwd)))

Andere Tipps

Es ist dies gefährlich: xkcd bobby Tabellen

SQL Injection beiseite, es sieht aus wie Ihre Passwörter können im Klartext gespeichert werden, was nicht so toll ist.

Dieser Code ist sehr sicher, wenn Sie nie $ Abfrage in einer SQL-Datenbank übergeben.

Wenn man 0';drop table users;-- für einen Namen schreiben

Ihr Befehl würde am Ende als

select name, pwd form users where name='0'; 
drop table users; --'and pwd = '[VALUE OF PWD]'

Also zunächst würde es Ihre Daten bekommen, dann die Benutzer-Tabelle töten, und mit dem Rest nichts tun, da es ein Kommentar.

Bestimmte mysql Befehle in PHP mehrere Abfragen durchführen wird, wenn SQL übergeben, der beste Weg, dies ist parametrisierte Abfragen zu vermeiden.

Ich benutze PDO für alle meine DB-Zugriff, und es sehr empfehlen. Ich habe noch keine Links aus der Spitze von meinem Kopf, aber ich erinnere mich, die Tutorials, die ich verwenden gekrönt Google.

Es ist nicht nur anfällig für SQL-Injektionen, wird es auch in Fällen fehlschlagen, wo eine Injektion ist nicht einmal gedacht:

Zum Beispiel möchte ein Benutzer den Namen "Guillaume François Antoine, Marquis de L'Hospital". Da der Benutzername ein Angebot enthält, und Sie sind auf der Flucht nicht, Ihre Abfrage fehlschlagen, obwohl der Benutzer das System nie brechen wollte!

Verwenden Sie entweder PDO oder tun es auf diese Weise:

$query = sprintf(
                   "SELECT 1 FROM users WHERE name = '%s' AND password = '%s'",
                   mysql_real_escape_string($_POST['name']),
                   mysql_real_escape_string(md5($_POST['password']))
                 );

Ob Sie es glauben oder nicht, das ist sicher ... wenn magic_quotes_gpc eingeschaltet ist. Welche es nie in PHP6 sein wird, so dass es vor dann Fixierung ist eine gute Idee.

  1. $_POST['user'] = "' or 1=1; --"; Jeder bekommt direkten Zugriff auf Ihre App

  2. $_POST['user'] = "'; DROP TABLE user; --"; Vergessen Sie Ihren (bezahlt?) Benutzerliste Auf Wiedersehen

  3. Wenn Sie später echo $ name in Ihrer Ausgabe, dass in einem XSS-Injection-Angriff führen kann

: O tut es nicht nie, Dies kann SQL-Injection-Angriff führen. Wenn zum Beispiel eine Benutzereingabe irgendwie:  ‘drop table Benutzer - als Eingabe in $ username; Dieser Code wird Ihren ursprünglichen Code concatinate und Tisch fallen. Der Hacker kann mehr tun, und Ihre Website hacken kann.

Dies ist in der Regel sehr gefährlich. Es könnte von Datenbankberechtigungen in einigen Fällen abgemildert werden.

Sie bestätigen nicht den Eingang ($ name und $ PWD). Ein Benutzer könnte in SQL in einem oder beiden dieser Felder senden. Die SQL könnten auch andere Daten in der Datenbank löschen oder ändern.

Sehr sehr gefährlich. Eine gute Idee für Passwörter ist das Passwort in eine MD5-Hash zu konvertieren und speichern, die als der ‚Passwort‘ des Benutzers.
1) schützt die Benutzer aus, die ihre Passwörter gestohlen 2), wenn ein Benutzer eine manipulierte Zeichenfolge schreibt könnten sie auszulöschen Ihre Eingabe / Tabelle / Datenbank

Auch sollten Sie auf den Namen einige grundlegende Spiel regulären Ausdruck tun, um sicherzustellen, dass es nur A-Za-z0-9 verwendet und vielleicht ein paar akzentuierte Zeichen (keine Sonderzeichen, * ‚s, <‘ s,> 's insbesondere).

Wenn der Benutzer Daten in einer SQL-Abfrage involed wird, sanatize immer die Daten mit mysql_real_escape_string .

Darüber hinaus sollten Sie speichern nur eine gesalzene Hash des Passworts anstelle des Passwortes selbst. Sie können die folgende Funktion verwenden, um eine gesalzene Hash mit einem zufälligen Salt-Wert zu erzeugen und prüfen:

function saltedHash($data, $hash=null)
{
    if (is_null($hash)) {
        $salt = substr(md5(uniqid(rand())), 0, 8);
    } else {
        $salt = substr($hash, 0, 8);
    }
    $h = $salt.md5($salt.$data);
    if (!is_null($hash)) {
        return $h === $hash;
    }
    return $h;
}

Alle zusammen:

$query = 'SELECT pwd FROM users WHERE name = "'.mysql_real_escape_string($_POST['user']).'"';
$res = mysql_query($query);
if (mysql_num_rows($res)) {
   $row = mysql_fetch_assoc($res);
   if (saltedHash($_POST["pwd"], $row['pwd'])) {
       // authentic
   } else {
       // incorrect password
   }
} else {
   // incorrect username
}

Es ist nicht sicher, möchten Sie vielleicht in etwas wie PDO suchen. PHP PDO

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