Vor SQL Injection schützen mit mysql_real_escape_string()

Spelmann

Erfahrenes Mitglied
Hallo zusammen,
Ich stelle dem User eine einfache Suchfunktion zur Verfügung.
Den Suchbegriff wollte ich mit mysql_real_escape_string() maskieren, um manipulative Eingaben abzuwehren.
Also habe ich mir das so gedacht:

PHP:
$suchbegriff = mysql_real_escape_string($_POST['suche']);
if($ergebnis = $db->query('SELECT * FROM liste WHERE suchbegriffe LIKE "%'.$suchbegriff.'%" ')){

So einfach scheint das aber wohl nicht zu funtionieren. Das Ganze erzeugt einen Fehler:

Code:
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]:
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in...

Kann mir jemand erklären, was ich falsch gemacht habe und wie es richtig aussehen muss?
 
Wenn ich den Fehler richtig Interpretiere hast du keine Verbindung zu deiner Datenbank und MySQL hergestellt.

Diese Funktion funktioniert aber nur wenn man eine Verbindung zu MySQL hergestellt hat.

Ich rate dir erst einmal mit get_magic_quotes_gpc() prüfen ob bereits Slashes gesetzt sind. Wenn ja diese ersteinmal mit stripslashes() entfernen.
 
Hi CookieBuster,
ne die Datenbankanbindung steht.
ohne mysql_real_escape_string() funktionierts auch.
Wozu soll ich get_magic_quotes_gpc() einsetzen? Ich weiß doch was ich beim Testen ins Feld schreibe. Oder habe ich Dich nicht richtig verstanden?
 
Mmh. Ich verstehe nicht wirklich was ihr meint.
Hier nochmal auführlicher mit der Datenbankanbindung:

PHP:
require_once("include/db_connect.inc.php");
$db = Singleton::holeVerbindung();
$db->select_db('DB0815');
$suchbegriff = mysql_real_escape_string($_POST['suche']);
if($ergebnis = $db->query('SELECT * FROM liste WHERE suchbegriffe LIKE "%'.$suchbegriff.'%" ')){

Was verstehe ich da falsch? Wie gesagt, ohne mysql_real_escape_string() ergibt die Anfrage ja ein Ergebnis!
Würde doch nicht gehen wenn ich keine Verbindung zur Datenbank hätte.
Oder mein ihr, der Befehl an der falschen Position?
So funktionierts aber auch nicht:

PHP:
if($ergebnis = $db->query('SELECT * FROM liste WHERE suchbegriffe LIKE
"%'.mysql_real_escape_string($_POST['suche']).'%" ')){

Ich befürchte ich brauche eine etwas ausführlichere Erklärung, um zu verstehen worum es geht.
Vielen Dank.
 
Würde doch nicht gehen wenn ich keine Verbindung zur Datenbank hätte.
Die Frage ist, wann genau die Verbindung zur Datenbank aufgebaut wird. Konkreter: wann [phpf]mysql_connect[/phpf] aufgerufen wird. Ich weiß nicht was alles in der Datenbank-Klasse passiert, aber möglicherweise wird die Verbindung erst aufgebaut, wenn sie wirklich gebraucht wird – also beim Aufruf von $db->query. Denn eigentlich sollte [phpf]mysql_real_escape_string[/phpf] die Verbindung vom letzten Aufruf von [phpf]mysql_connect[/phpf] verwenden. Ansonsten könntest du mal schauen, ob die Datenbank-Klasse nicht schon eine Methode anbietet, die sich um das Escaping kümmert. Dann wäre diese natürlich vorzuziehen.

Grüße, Matthias
 
Ach, Singleton ist überschaubar:

PHP:
class Singleton{
static $db = null;
function holeVerbindung() {
if (self::$db == null){
self::$db = new mysqli ('localhost', 'root', 'trallala');
}
return self::$db;
}

Ich habe diesen Weg eine Datenbankverbindung herzustellen aus einem Tutorial. Verstehe den Vorgang aber nicht wirklich.
Lässt sich denn hieraus ersehen, ob die Verbindung erst nach der Formulierung der Abfrage (darum gehts doch, wie ich ahne zu verstehen) hergestellt wird?
 
Da stimme ich zu. Die mysql_ und mysqli_ Funktionen sind voneinander getrennt, weshalb sie auch keine gegenseitigen Verbindungen nutzen können.
[phpf]mysqli_real_escape_string[/phpf] erwartet als ersten Parameter die aktuelle Verbindung, falls du es im prozeduralen Stil verwendest.
 
Ich danke euch für eure Geduld.
Ok. Ich hab es nun mit mysqli_real_escape_string() vesucht.
Bekomme ich auch einen Fehler:
PHP:
Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in...

Ist der fehlende Parameter jetzt auch wieder die Datenbankanbindung?
Ich weiß dabei nicht wirklich worin der Unterschied zwischen Objektorientiert und Prozedural besteht.

Wenn die Maskierung innerhalb des query stattfindet ($db->query(...)) muß doch die Verbindung zur Datenbank stehen, oder nicht? Ich verstehe die Logik dahinter nicht.

Bin dankbar für weitere Hilfe, um meinem verrenkten Hirn auf die Sprünge zu helfen.
 
Zurück