4 Stimmen

MySQL/PHP - Umgehung von Zeichen, die meine Datenbank verlangsamen (oder sie zu unerwarteten Ergebnissen führen)

Ich lasse alle meine Ganzzahlen durch eine (int)Integer um sie in meinen Abfragezeichenfolgen sicher zu verwenden.

Ich lasse meine Zeichenketten auch durch diesen Funktionscode laufen:-

if(!get_magic_quotes_gpc()) {
           $string = mysql_real_escape_string($string);
        }

$pattern = array("\\'", "\\\"", "\\\\", "\\0");
$replace = array("", "", "", "");
if(preg_match("/[\\\\'\"\\0]/", str_replace($pattern, $replace, $string))) $string = addslashes($string); 

$cleanedString = str_replace('%','',$string);

Ich gebe natürlich die Variable $cleanedString zurück. Jetzt ersetze ich das %-Zeichen, weil es für mySQL ein Platzhalter ist und meine Abfragen möglicherweise verlangsamen könnte (oder falsche Daten zurückgeben würde), wenn der Benutzer es einfügt. Gibt es noch andere Sonderzeichen für mySQL, auf die ich achten sollte?

Zweitens: Ist etwas falsch oder überflüssig an meinem Suchen und Ersetzen nach der mysql_real_escape_string ? Ich habe es von einer Website, wenn ich zum ersten Mal aus und (wenn ich mich richtig erinnere) sagte, dass Sie diese Suche / Ersetzen zusätzlich zu den Escape-Zeichenfolge verwenden musste. Es sieht aus wie es versucht, alle zuvor escaped Injektionszeichen zu entfernen?

7voto

Bill Karwin Punkte 493880

Okay, ich habe mehrere Kommentare:

  • Die magische Zitierfunktion ist Abgelehnt sollte Ihre PHP-Umgebung niemals magische Anführungszeichen aktivieren. Daher sollte es nicht notwendig sein, danach zu suchen, es sei denn, Sie entwickeln Code, der in den Umgebungen anderer Kunden eingesetzt werden kann, die (unvorsichtigerweise) magische Anführungszeichen aktiviert haben.

  • Der reguläre Ausdruck in Ihrer preg_match() ist falsch, wenn Sie nach Zeichenfolgen suchen. Ein regulärer Ausdruck wie [xyz] passt zu jeder eine der einzelnen Zeichen x, y oder z. Die Zeichenfolge xy oder yz wird nicht gefunden. Wie auch immer, das ist akademisch, weil ich nicht glaube, dass man Sonderzeichen auf diese Weise überhaupt suchen oder ersetzen muss.

  • mysql_real_escape_string() ist ausreichend, um String-Literale zu entschlüsseln, die Sie in Anführungszeichen in SQL-Strings einfügen wollen. Eine Stringsubstitution für andere Anführungszeichen, Backslashes usw. ist nicht erforderlich.

  • % y _ sind Wildcards in SQL nur bei der Verwendung von Mustervergleichen mit LIKE Ausdrücke. Diese Zeichen haben keine Bedeutung, wenn Sie nur mit Gleichheits- oder Ungleichheitsoperatoren oder Regexps vergleichen. Auch wenn Sie mit LIKE Ausdrücke, ist es nicht notwendig, diese Zeichen zum Schutz vor SQL-Injection zu entschlüsseln. Es bleibt Ihnen überlassen, ob Sie sie als wörtliche Zeichen (in diesem Fall mit einem Backslash) oder als Wildcards in einer LIKE Ausdruck (in diesem Fall lassen Sie sie einfach drin).

  • All dies gilt, wenn Sie PHP-Variablen in SQL-Ausdrücke anstelle von literalen String-Werten interpolieren. Escaping ist überhaupt nicht notwendig, wenn Sie gebundene Abfrageparameter anstatt zu interpolieren. Gebundene Parameter sind nicht in der einfachen "mysql"-API, sondern nur in der "mysqli"-API verfügbar.

  • Ein weiterer Fall ist, dass Sie PHP-Variablen anstelle von SQL-Tabellennamen, Spaltennamen oder anderer SQL-Syntax einfügen. In solchen Fällen können Sie keine gebundenen Parameter verwenden; gebundene Parameter nur nehmen den Platz von String-Literalen ein. Wenn Sie den Spaltennamen dynamisch machen müssen (z.B. um ORDER BY eine Spalte mit den Präferenzen des Benutzers), sollten Sie den Spaltennamen abgrenzen mit hinteren Anführungszeichen (in MySQL) oder eckigen Klammern (Microsoft) oder doppelten Anführungszeichen (andere Standard-SQL).

Ich würde also sagen, dass Ihr Code einfach auf das Folgende reduziert werden kann:

$quotedString = mysql_real_escape_string($string);

Das ist wenn Wenn Sie die Zeichenkette für die Interpolation verwenden wollen, ist es noch einfacher, wenn Sie sie als gebundenen Parameterwert verwenden wollen:

$paramString = $string;

3voto

nickf Punkte 517253

Ja, ich glaube, Sie haben da eine etwas merkwürdige Situation erwischt.

Zunächst einmal würde ich nach magischen Zitaten suchen und entfernen die Schrägstriche, wenn sie eingeschaltet ist. Auf diese Weise haben Sie eine Zeichenkette, die tatsächlich die gewünschten Informationen enthält (und nicht eine, die mit Schrägstrichen behandelt wurde).

Wenn Sie vor allem den Platzhalter % entfernen möchten, können Sie diesen einfach ausblenden oder ganz entfernen. Bevor Sie die Zeichenkette in eine SQL-Abfrage einfügen, lassen Sie sie schließlich durch mysql_real_escape_string laufen, und alles wird gut.

$string = $_POST['searchTerm'];
if (get_magic_quotes_gpc()) {
    $string = stripslashes($string);
}
$string = str_replace("%", "", $string);
$safeString = mysql_real_escape_string($string);

2voto

Paige Ruten Punkte 164391

Mysql_real_escape_string() tilgt diese Zeichen für Sie:

\x00 , \n , \r , \, ', " und \x1a

Sie brauchen ihnen also nicht selbst zu entkommen. Ich schlage vor, Schrägstriche zu entfernen, wenn magische Anführungszeichen eingeschaltet sind, und dann mysql_real_escape_string() zu benutzen:

if(get_magic_quotes_gpc()) {
    $string = stripslashes($string);
}

$string = mysql_real_escape_string($string);

$cleanedString = str_replace('%','',$string);

Außerdem sind Unterstriche in MySQL Platzhalter für einzelne Zeichen, so dass Sie vielleicht etwas dagegen tun möchten.

2voto

Zoredache Punkte 34350

Wenn Sie sich wirklich Sorgen um SQL-Injection-Probleme machen, sollten Sie unbedingt vorbereitete Anweisungen verwenden. Da die SQL-Anweisung ausgewertet wird, bevor Ihre Benutzerdaten bereitgestellt werden, ist Ihr Code viel sicherer.

Siehe PDO, und Mysqli

-1voto

UnkwnTech Punkte 83318

Zu Ihrem zweiten Punkt:
Es ist völlig überflüssig, alle Zeichen wurden korrekt escaped, wenn Sie es durch mysql_real_escape_string() laufen lassen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X