Frage

Sorry für meinen Code nicht formatieren. die Werkzeugleiste verschwunden war ...

Ich möchte einige Daten in eine MySQL-Datenbank einzufügen. Ich habe eine Funktion in PHP geschrieben:

function add_ID($ID, $token)  {
 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
 mysql_query($add);
 echo 'added successfully';
}  
if(isset($_GET['addDeviceID'])) {
 add_ID($_GET['ID'], $_GET['token']);
}

In der URL-Feld meiner Browswe Ich bin die Funktion wie das Aufruf: http://www.justanexample.com/example.php?ID=123123123&token= zu

Das funktioniert.

Wenn ich ein Leerzeichen entweder in einer der Parameter zum Beispiel wie folgt aus: http://www.justanexample.com/example.php?ID=123123 123 & token = zu

Nichts wurde zu meiner MySQL-Datenbank hinzugefügt.

Wäre toll, etwas Hilfe zu bekommen :) Vielen Dank!

War es hilfreich?

Lösung

Ihre Funktion ist es, SQL-Injection verwundbar. Sie sollten alle vom Benutzer empfangenen Parameter überprüfen, bevor sie in einer SQL-Abfrage verwenden, und alle Saiten durch mysql_real_escape_string passieren, denn dann könnte ich in so etwas wie example.php?token='; DROP DATABASE; und fürstlich vermasselt Ihre Anwendung nur passieren.

In Ihrem Fall sollten Sie eine Überprüfung, dass die empfangenen Parameter in Form sind, dass Sie zunächst erwarten, geben einen Fehler zurück an den Benutzer, wenn sie es nicht tun, und nur dann in die SQL-Abfrage übergeben.

function add_ID($ID, $token)  {
  $id = mysql_real_escape_string($id);
  $token = mysql_real_escape_string($token);

  $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
  mysql_query($add);
  echo 'added successfully';
}  

if(isset($_GET['addDeviceID'])) {
  $id    = isset($_GET['id']) ? $_GET['id'] : 0; // in case no ID has been passed in
  $token = isset($_GET['token']) ? $_GET['token'] : '';

  if (!is_numeric($id) {
    die('ID is not a number');
  } 

  // validate token here as well

  add_ID($id, $token);
}

Sie sollten auch in parametrisierte Abfragen aussehen, welche eine Gesamt viel bessere Möglichkeit, SQL-Abfragen zu tun mit Parametern als nur String-Verkettung verwenden. Dazu Blick in mit der mysqli-Erweiterung anstelle von mysql, oder auf einer höheren Ebene, PDO.

Andere Tipps

Sie sollten Ihre Eingabe validieren, bevor sie in die Datenbank zu senden. Oder, wenn die Validierung ist nicht möglich, Filter und / oder den Wert zu entkommen.

Validierung

Wenn Sie erwarten, ID eine ganze Zahl größer als Null ist:

if (!ctype_digit($ID)) {
    // invalid ID
}

Wenn Sie erwarten, Token eine alphanumerische Zeichenfolge sein:

if (!ctype_alnum($token)) {
    // invalid token
}

Filter

Die Filterung wird ungültige Teile des Eingangs zu entfernen, so dass es gültig wird:

if (!ctype_digit($ID)) {
    $ID = preg_replace('/\D+/', '', $ID);
    // $ID does now only contain digits
}
if (!ctype_alnum($token)) {
    $token = preg_replace('/\D+/', '', $token);
    // $token does now only contain alphanumeric characters
}

Escaping

Escaping ersetzt das Meta-Zeichen von einem bestimmten Kontext einiger Zeichenfolge gemeint ist in platziert wird für MySQL-Abfragen sollten Sie eine Funktion verwenden, die das Meta-Zeichen des Kontext string Erklärung in MySQL . PHP hat die mysql_real_escape_string Funktion zu diesem Zweck:

$add = "INSERT INTO ids (ID, token) VALUES ('".mysql_real_escape_string($ID)."', '".mysql_real_escape_string($token)."')";

Remove Raum von ihnen mit str_replace Funktion zB:

 $ID = str_replace(' ', '', $ID);
 $token= str_replace(' ', '', $token);

 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";

Auch ich vermute, Ihre $ ID ist ein Integer-Feld in der Tabelle, so dass Sie Ihre Abfrage zB ohne Angabe Anführungszeichen ausführen können:

 $add = "INSERT INTO ids (ID, token) VALUES ($ID, '$token')";

Der Code wird unter der Annahme, die Abfrage erfolgreich abgeschlossen wird, ohne jemals überprüft, ob ein Fehler aufgetreten ist. Ich vermute, es wird durch die Räume ein Syntaxfehler sein. Wenn Ihr ID-Feld ein Integer-Typ ist, dann ID=123 123 tun wird die Syntaxfehler sein. Einschließlich aller SQL-Injection und Daten desinfizierende Beratung in den anderen Antworten, sollten Sie Ihre add_ID Funktion wie folgt umschreiben:

function add_ID($ID, $token) {
  $query = 'blah blah blah';
  mysql_query($query);
  if (mysql_error()) {
       echo 'ruhroh, someone set us up the bomb: ', mysql_error();
  } else {
       echo 'woohoo, it worked!';
  }
}

Zumindest werden Sie feststellen, ob die Abfrage wirklich nicht gelungen, und was die Luft sprengte, wenn es nicht tat. Niemals davon ausgehen, dass eine Datenbankabfrage jeglicher Art erfolgreich sein wird. Es gibt viel zu viele Möglichkeiten, es zu sprengen (Server starb Transaktion Deadlock, Connection-Pool erschöpft, aus Festplattenspeicher, etc ...) nicht einmal etwas vereinfachend Fehler haben Handhabung wie oben.

Sie können str_replace zu entfernen Leerzeichen verwenden. Aber es ist keine gute Praxis. Wie können URL so modifiziert werden? Im Normalfall ist es unwirklich. Im Gegensatz, sollten Sie alle Eingabewerte von User-Test (ID muss eine ganze Zahl sein, Token sollte nicht enthält „"“Symbol und andere Kontrollen). Lesen Sie mehr über SQL-Injektionen.

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