Sollte ich mysql_real_escape_string alle Cookies ich von dem Benutzer erhalten mysql Injektion in PHP zu vermeiden?

StackOverflow https://stackoverflow.com/questions/90517

  •  01-07-2019
  •  | 
  •  

Frage

Wenn ein Benutzer auf meiner Website geht, mein Skript prüft, ob zwei Cookies, die den Benutzer-ID speichern + Teil des Passworts, automatisch in sie loggen sein.

Es ist möglich, den Inhalt von Cookies über ein Cookie-Editor zu bearbeiten, so dass ich denke, es ist möglich, einige bösartigen Inhalte auf eine schriftliche Cookie hinzufügen?

Soll ich mysql_real_escape_string (oder etwas anderes), um alle meine Cookie Anrufe hinzufügen, oder gibt es eine Art von in-Verfahren gebaut, die dies nicht zulassen wird passieren?

War es hilfreich?

Lösung

Was Sie wirklich müssen, ist nicht möglich, diese Cookie-Werte senden, die in erster Linie hackable sind. Stattdessen hash, warum nicht die Benutzername und das Passwort und ein (geheimes) Salz und festgelegt, dass als Cookie-Wert? das heißt:.

define('COOKIE_SALT', 'secretblahblahlkdsfklj');
$cookie_value = sha1($username.$password.COOKIE_SALT);

Dann wissen Sie, die Cookie-Wert wird immer eine 40-stellige hexadezimale Zeichenfolge sein, und kann den Wert vergleichen, der Benutzer mit dem, was die in der Datenbank zurückschickt, um zu entscheiden, ob sie gültig ist oder nicht:

if ($user_cookie_value == sha1($username_from_db.$password_drom_db.COOKIE_SALT)) {
  # valid
} else {
  #not valid
}

mysql_real_escape_string einen zusätzlichen Schlag in die Datenbank macht, BTW (viele Menschen nicht erkennen, es eine DB-Verbindung erfordert und fragt MySQL).

Der beste Weg, zu tun, was Sie wollen, wenn Sie nicht Ihre App und darauf bestehen, mit hackable Cookie-Werte ändern kann, ist die Verwendung vorbereitete Anweisungen mit gebundenen Parametern .

Andere Tipps

Der Punkt von mysql_real_escape_string ist nicht gegen Injection-Angriffe zu schützen, ist es Ihre Daten, um sicherzustellen, genau in der Datenbank gespeichert sind. So soll es auf jedem String geht in die Datenbank, unabhängig von ihrer Quelle genannt werden.

sollten Sie jedoch auch werden parametrisierte Abfragen mit (über mysqli oder PDO) sich von SQL-Injection zu schützen. Andernfalls besteht die Gefahr, enden Sie sich wie kleine Schule Bobby Tables.

Ich verwende nur mysql_real_escape_string vor Variablen in eine SQL-Anweisung einfügen. Sie werden sich nur verwirrt, wenn einige Ihrer Variablen bereits entkam, und man sie dann wieder entkommen. Es ist ein klassischer Fehler, den Sie in Neulingen Blog Webapps sehen:

  

Wenn jemand schreibt einen Apostroph es Hiebe auf das Hinzufügen ruinieren den Blog \\\\\\\ 's Seiten hält.

Der Wert einer Variablen ist an sich nicht gefährlich. Es ist nur, wenn Sie es in einen String oder etwas ähnliches setzen, dass Sie verirrt in gefährliche Gewässer beginnen

Natürlich aber nie etwas vertrauen, die von der Client-Seite kommt.

Vorbereitete Anweisungen und Parameterbindung ist immer ein guter Weg zu gehen.

PEAR :: MDB2 unterstützt vorbereitete Anweisungen, zum Beispiel:

$db = MDB2::factory( $dsn );

$types = array( 'integer', 'text' );
$sth = $db->prepare( "INSERT INTO table (ID,Text) (?,?)", $types );
if( PEAR::isError( $sth ) ) die( $sth->getMessage() );

$data = array( 5, 'some text' );
$result = $sth->execute( $data );
$sth->free();
if( PEAR::isError( $result ) ) die( $result->getMessage() );

Dies wird nur korrekte Daten und voreingestellte Menge von Variablen ermöglicht in der Datenbank zu erhalten.

Sie sollten natürlich Daten überprüfen, bevor diese weit gekommen, aber Aussagen Vorbereitung der abschließenden Validierung ist, was getan werden sollte.

Sie sollten mysql_real_escape_string alles , die potenziell schädlich sein könnte. Vertrauen Sie nie jede Art von Eingabe, die durch den Benutzer verändert werden kann.

Ich stimme Ihnen zu. Es ist möglich, die Cookies und sendet in bösartigen Daten zu ändern.

Ich glaube, dass es gute Praxis ist es, die Werte, die Sie von den Cookies erhalten zu filtern, bevor Sie sie verwenden. Als Faustregel kann ich andere Eingabe filtern, die manipuliert werden können.

Yegor, können Sie den Hash speichern, wenn ein Benutzerkonto erstellt / aktualisiert werden, dann, wenn ein Login eingeleitet wird, hash Sie die an den Server gesendet Daten und vergleichen gegen das, was für diesen einen Benutzernamen in der Datenbank gespeichert wurde.

(Aus der Spitze von meinem Kopf in loser php - behandeln, als Pseudo-Code):

$usernameFromPostDbsafe = LimitToAlphaNumUnderscore($usernameFromPost);
$result = Query("SELECT hash FROM userTable WHERE username='$usernameFromPostDbsafe' LIMIT 1;");
$hashFromDb = $result['hash'];
if( (sha1($usernameFromPost.$passwordFromPost.SALT)) == $hashFromDb ){
    //Auth Success
}else{
   //Auth Failure
}

Nach einer erfolgreichen Authentifizierung, können Sie die Hash-in $ _SESSION speichern oder in einer Datenbanktabelle im Cache authentifizierte Benutzername / Hashes. Dann den Hash sendet zurück an den Browser (in einem Cookie zum Beispiel), so dass nachfolgende Seite lädt den Hash zurück an den Server sendet gegen die in der gewählten Sitzungsspeicher gehalten Hash verglichen werden.

mysql_real_escape_string ist so passé ... In diesen Tage wirklich Parameterbindung stattdessen verwenden sollte.

Ich werde erarbeiten von mentionning, dass ich bezog sich auf Prepared Statements und einen Link zu einem Artikel zur Verfügung stellen, die zeigt, dass manchmal mysl_real_escape_string nicht ausreichend genug: http://www.webappsec.org/projects/ Artikel / 091007.txt

Ich würde empfehlen, htmlentities ($ input, ENT_QUOTES) anstelle von mysql_real_escape_string, weil dies auch eine versehentliche Ausgabe von tatsächlichen HTML-Code verhindern. Natürlich können Sie mysql_real_escape_string und htmlentities verwenden könnte, aber warum würden Sie?

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