Frage

Ich erbte gerade ein Projekt, weil der letzte Entwickler überlassen. Das Projekt wird aus dem Code Igniter gebaut. Ich habe noch nie gearbeitet mit Code Igniter vor.

Ich habe einen kurzen Blick auf den Code, und ich sehe Datenbank Anrufe in der Steuerung wie folgt aus:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");

oder Anrufe wie folgt aus:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");

Hat Code Zünder saniert automatisch diese Abfragen SQL-Injection zu verhindern?

War es hilfreich?

Lösung

CodeIgniter DOES die Variablen ESCAPE Sie vorbei, wenn die $this->db->query Methode. Aber nur, wenn Sie die Variablen wie bindet passieren, hier ein Beispiel:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));

Denken Sie auch daran, dass $_POST nicht über $this->input->post bevorzugt werden sollte, da, was es tut, ist zu überprüfen, ob die Variablen Fehler zu vermeiden besteht.

Andere Tipps

CodeIgniter ein paar String-Funktionen in der Datenbank Schicht entweicht.

Auszug aus CI-Handbuch :

  

Es ist eine sehr gute Sicherheitspraxis Ihre Daten zu entkommen, bevor es in die Datenbank eingeben. CodeIgniter hat drei Methoden , dass Sie dies helfen tun:

     
      
  1. $ this-> db-> escape () Diese Funktion bestimmt den Datentyp, so dass es nur String-Daten entweichen kann. Es fügt auch automatisch einfache Anführungszeichen um die Daten, so dass Sie nicht zu tun haben:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    
  2.   

Ich würde die beiden anderen Beispiele veröffentlichen, aber ich würde nicht den ganzen Spaß aus der Lektüre der manuellen nehmen wollen.

Nein, erzielte der Code, den Sie ist anfällig für SQL-Injection. Sie müssen Abfragebindung verwenden, um SQL-Abfragen zu erstellen. Wenn Sie die CI DB-Bibliothek verwenden, würden Sie es so etwas wie dies (zB aus der Bedienungsanleitung) Code:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick')); 

Nein, CodeIgniter nicht auf magische Weise Abfragen sanieren, die wie folgt aufgebaut worden sind.

Nach CI docs hier , POST die Rahmen Filter auf Steuerungsbau. Es ist auch optional tut XSS Filterung entweder manuell durch Aufruf der Funktion oder eine globale Konfigurationseinstellung.

Ich habe noch nie CI entweder außer nur zu spielen mit ihr verwendet, so dass ich bin mir nicht sicher, wie weit würde ich diese vertrauen.

Das macht nichts entgehen. Sie sind besser dran, um es in der bind Syntax zu ändern oder die aktive Datensatz Syntax

Sie sollten verwenden $ this-> Input-> post, Abfragebindung und aktive Datensatz die sichereren Daten zu haben und dann sicher noch, Test Test Test.

Verwenden Sie aktive Datensatz für Sicherheit und einfachere Codierung:

Statt:

  $dbResult = $this->db->query("SELECT * FROM users WHERE username'".$_POST['user_name']."'");

Use (gleiches Ergebnis):

$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');

Es kann ein Schmerz sein, aber Sie sollen Ihre Fragen zu aktiver Datensatz umwandeln.

Ich bin Kopieren aus dem CodeIgniter Handbuch: „Beyond Einfachheit, ein großer Vorteil, die Active Record Funktionen ist, dass es Sie Datenbank unabhängige Anwendungen erstellen können, da die Abfragesyntax von jedem Datenbankadapter erzeugt wird. Es ermöglicht auch sicherer Abfragen, da werden die Werte automatisch vom System entkam. "

Und wie einige Leute schon gesagt, ja dieser Code ist anfällig für SQL-Injection

Optimiertes mit einem zweiten Stiels param (TRUE) XSS auf der Eingangsebene zu filtern:

$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');

Bibliotheken / input.html

Die docs für (mindestens) 2,2 Zustand in einem große rote Box:

  

Obwohl Active Record wird sein Bestes versuchen, richtig alle Feld- und Tabellennamen zu zitieren, dass man es füttern, beachten Sie, dass es nicht darauf ausgelegt ist, mit beliebigen Benutzereingaben zu arbeiten. NICHT es füttert mit aufpoliert Benutzerdaten.

Welche dieser Programmierer bedeutet "verlassen sich nicht auf Active Record zu zitieren alles ".

Mit Escape-Funktion zur Injektion von CI

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top