Frage

Wie kann ich in Codesigniter die SQL -Injektion vermeiden? Gibt es eine Methode, die in der Konfigurationsdatei eingestellt werden kann, um die SQL -Injektion zu vermeiden? Ich verwende diesen Code für die Auswahl von Werten:

$this->db->query("SELECT * FROM tablename WHERE var='$val1'");

und dies zum Einfügen von Werten:

$this->db->query("INSERT INTO  tablename (`var1`,`var2`) VALUES ('$val1','$val2')");

Eine andere Methode zum Einfügen und Auswahl von Werten aus der Datenbank ist der Codesigniter insert() und get() Methoden. Ist jede Chance, eine SQL-Injektion bei der Verwendung des Bulit-in-Funktion von Codesigniter zu verwenden

War es hilfreich?

Lösung

Codesigniter Aktiver Rekord Methoden entkommen automatisch Abfragen für Sie, um die SQL -Injektion zu verhindern.

$this->db->select('*')->from('tablename')->where('var', $val1);
$this->db->get();

oder

$this->db->insert('tablename', array('var1'=>$val1, 'var2'=>$val2));

Wenn Sie keine aktiven Datensätze verwenden möchten, können Sie verwenden Abfragebindungen gegen Injektion zu verhindern.

$sql = 'SELECT * FROM tablename WHERE var = ?';
$this->db->query($sql, array($val1));

Oder zum Einfügen können Sie die verwenden insert_string() Methode.

$sql = $this->db->insert_string('tablename', array('var1'=>$val1, 'var2'=>$val2));
$this->db->query($sql);

Es gibt auch die escape() Methode, wenn Sie es vorziehen, Ihre eigenen Fragen auszuführen.

$val1 = $this->db->escape($val1);
$this->db->query("SELECT * FROM tablename WHERE var=$val1");

Andere Tipps

Sie können verwenden

$this->db->escape()

Methode..

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

Andere Methoden sind hier aufgeführt.

http://codegniter.com/user_guide/database/queries.html

Sie sollten versuchen, Ihre Anfragen direkt in eine Zeichenfolge zu schreiben und sie dann an die Abfragefunktion weiterzugeben. Eine bessere Option wäre die Verwendung der aktiven Datensatzklasse, die Ihre Abfragen für Sie erstellt und den Werten entkommt. http://codegniter.com/user_guide/database/active_record.html

Wenn Sie die Verwendung der aktiven Datensatzklasse aus irgendeinem Grund vermeiden möchten, können Sie die Codesigniter -Dokumentation für die Datenbankklasse anzeigen, die eine Fluchtmethode zum Entgehen Ihrer Werte enthält, bevor Sie sie an die Abfragemethode weitergeben. http://www.codegnitor.com/user_guide/database/queries.html

Ben

In Codesigniter: Es gibt 2 Maßnahmen zur Verhinderung der SQL -Injektion. Für diejenigen, die eine Neuheit in der Webprogrammierung sind, ist eine andere Art von Sicherheitsloch in der Webprogrammierung tödlich, da es Ihre innere Seite der Anwendungsdatenbank aufdecken kann, sondern eine SQL -Injektion.

Und zum Glück hat Codesigniter die Fähigkeit, damit umzugehen. Aber leider haben viele CI -Programmierer, die ich zusammengearbeitet habe (und sogar Sie), diese beiden Aktionen vergessen (oder könnte), um die Umstände der SQL -Injektion zu verhindern.

Bleiben Sie bei ActivereCord -Fähigkeiten. Das erste ist, dass es sich bei keiner Umstände mit der Abfrage der Daten unter Verwendung einer solchen Abfrage wie folgt befassen:

$this->db->query("select * from users where user=$user and password=$password")

Sie wissen nicht, was genau drinnen $ Benutzer oder $ Passwort Variable, wenn es um Benutzer geht, der absichtlich das Falsche tut. Sogar XSS Desinfektionsmittel werden sich nicht mit jemandem befassen, der eine Kombination aus Zitat, Semikolon oder Dash -Charakter eingibt. In diesem Fall müssen Sie diese aktive Aufzeichnungssache lernen, da sie in Einsatz -Desuitiser -Fähigkeiten zur Verhinderung der SQL -Injektion gewidmet sind. Und mach dir keine Sorgen, es unterstützt die Art von Funktionsketten wie folgt:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);

$query = $this->db->get();

Denken Sie jedoch daran, dass es nicht funktioniert, wenn Sie immer noch die übliche (teilweise) Abfragefunktion in der aktiven Datensatzfunktion wie folgt kombinieren:

$query = $this->db->where("title LIKE '%$input%'");

Was tatsächlich so geändert werden könnte.

$query = $this->db->like("title", $input);

Der Punkt ist, nutze jede Möglichkeit des aktiven Datensatzes von Codesigniter und leg dich nicht damit an.

Aber wenn das nicht funktioniert, gibt es eine Alternative, wenn Sie eine sehr lange Frage haben und sich nicht darum kümmern, sie in den Stil von Active Record umzuwandeln, können Sie Ihre Eingabe manuell mit dieser Funktion bereinigen:

$sanitised_title = $this->db->escape($title);

// für die Verwendung in Inside wie Abfrage

$sanitised_title = $this->db->escape_like_str($title);

Und Sie können die sanitäre/entkommene Eingabe in Ihrer Abfrage sicher verkettet.

Sie können prüfen, ob Sie nur Zahlenbuchstaben enthalten, dh Sie sind in Ihrem definierten Format. Bevor Sie es in die Abfrage einfügen

Während Sie den Wert von der Client -Seite akzeptieren, verwenden Sie diesen Code besser, um diesen Code besser zu verwenden.

$client = $this->input->post('client',TRUE);

Besser einfügen, um die Codesigniter -Einfügungsmethode zu verwenden,

$this->db->insert('tablename',$values);

Wenn Sie diese Methode verwenden, müssen Sie automatisch alle entkommen, sodass wir kein Fluchthandbuch benötigen.

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