Frage

Können Sie bitte geben Sie mir raten? Ich suchte nach Fragen, aber nicht etwas ähnlich zu Mine gefunden.

Wie kann ich meine Benutzereingaben automatisch entkommen, wenn sie dazu bestimmt sind, in SQL-Abfragen zu benutzen? Ich habe nicht in meinem Code wie mit etwas gefüllt wie

$var_x = $DB->Escape($_POST['var_x']);
$another_var = $DB->Escape($_POST['another_var']);
$some_string = $DB->Escape($_POST['some_string']);
...

Unter der Annahme, i Datenbank-Klasse mit Escape-Methode haben, die mysql_real_escape_string führt

Aber ich kann nicht Auto Escape auf SQL-Abfrage als auch gesetzt, da es Insert-Abfragen bricht:

function Exec($sql){
   $result = mysql_query($this->Escape($sql));
}

$q = $DB->Exec("SELECT * FROM table WHERE id = 'xxx'");

Es macht sie \ 'xxx \'. das ist falsch.

Das Letzte, was ich tun möchte, ist parametrisierte Aussagen zu machen, da es System komplizierter machen. Ich werde diese Option in Betracht ziehen, wenn nichts anderes übrig bleibt.

Kurz gesagt - wie intelligent Auto-Flucht zu machen, die mit ganzer Abfrage funktioniert und entkommen nur Werte

War es hilfreich?

Lösung

In der Tat, das eine und das einzige, was Sie jemals in Betracht ziehen sollten (wir nicht von Testprojekten sprechen hier, natürlich) ist parametrisierte Anweisungen zu verwenden. Dies ist die einzige Art und Weise (wenn SQL SYNAX für sich erlaubt, natürlich). Richtig gemacht, werden diese nicht Ihr System komplizierter machen, aber sie wird macht es robust.

Andere Tipps

Leider können Sie nicht automatisch alles. Wenn Sie Strings werden verkettet, werden Sie immer Charakter haben Probleme dort zu entkommen; das ist nicht etwas, das man einmal ‚lösen‘ kann und nie wieder denken.

Wenn Sie das tun:

$a= "a'b";
$query= "SELECT * FROM things WHERE name='$a'";

Dann ist Ihre Abfrage-Zeichenfolge enthält sowohl Apostrophe, die echte Apostrophe in Stringliterale sind, und Apostrophe, die String-Trennzeichen sind:

SELECT * FROM things WHERE name='a'b'

braucht man entkommen sein; der andere darf nicht. Wie können Sie sagen, was was ist? Sie können nicht, werden diese Informationen für immer verloren. Sie müssen stattdessen sagen:

$query= "SELECT * FROM things WHERE name='".mysql_real_escape_string($a)."'";

(oder je nachdem, was andere Escape-Funktion ist besser geeignet für die Datenbank Sie verwenden.)

Hässlich? Hell yeah. Deshalb haben wir parametrisierte Abfragen stattdessen verwenden. Dies wird weg von String-Verkettung mit all seinen Leiden.

String Verkettung sieht einfach aus. Die Leute denken, sie zusammen clodging Saiten verstehen. Aber wirklich, sie dies nicht tun.

Ich benutze diese Methode:

$db->set('name',$name);
$db->set('title',$title);
$db->insert('users');

Hier ist die $db->set() Methode entweicht automatisch den Wert (das heißt das zweite Argument).

Mit PHP 5 können Sie auch dies tun:

$db->set('name',$name)->set('title',$title)->insert('users');
  

Letzte, was ich tun möchte, ist parametrisierte Aussagen zu machen, da es System macht mehr   kompliziert. Ich werde diese Option in Betracht ziehen, wenn tut nichts anderes übrig.

Pflege Ihre Behauptung zu erklären, die parametrisiert Abfragen sind „komplizierter“? Ich verketten nicht externe Daten in Abfragen - immer - und es ist die einfachste Sache der Welt als auch zu tun, so viel näher an „wasserdichten“ als jede Flucht Technik zu sein, ist immer wahrscheinlich.

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