Mal wieder: SQL Injection

Wiedereinmal ein leidiges Thema.

Ich will mein Formular sicherer machen, hier mein Code
PHP:
//PHP Variablen vereinfachen und überprüfen

if(get_magic_quotes_gpc()) {
            $email   = stripslashes($_POST['email']);
						$name = stripslashes($_POST['name']);
						$city = stripslashes($_POST['city']);
						$adress = stripslashes($_POST['adress']); 
						$state = stripslashes($_POST['state']); 
						$country = stripslashes($_POST['country']);
						$zip = stripslashes($_POST['zip']);
						$session_id = session_id(); 
						$ip=$_SERVER['REMOTE_ADDR'];

} else {
            $email = $_SESSION['email'];
						$name = $_POST['name'];
						$city = $_POST['city'];
						$adress = $_POST['adress']; 
						$state = $_POST['state']; 
						$country = $_POST['country'];
						$zip = $_POST['zip'];
						$session_id = session_id(); 
						$ip=$_SERVER['REMOTE_ADDR'];
        } 


//MYSQL Query
$query = "INSERT INTO users (email,name,city,adress,state,country,zip,sessionid,ip) VALUES('".$email."','".$name."','".$city."','".$adress."','".$state."','".$country."','".$zip."','".$session_id."','".$ip."');";  

echo "<br><h1>";
echo $query;
echo "</h1>";

$result = mysql_query($query) OR die(mysql_error());

Ich will das ähnlich bauen wir hier im Beispiel:
http://us2.php.net/manual/en/mysqli.real-escape-string.php

Nur blick ich am Schluss nicht ganz durch wie man dann letztendlich die Abfrage startet.
Hat irgendjemand ein Vorschlag?

Grüße,
prinzschleifer
 
Verstehe gerade nich wo dein Problem ist - du machst einfach um deine $_POST-Variablen den funktionsaufruf.

php.net hat gesagt.:
Escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection

Das heißt einfach nur das Zeichen wie einzelne Hochkomma usw. mit einem Backslash durch die Funktion escaped werden damit man mit Hilfe der Variable nicht im SQL-Statement rummanipulieren kann sondern die ganze Variable immernoch als String interpretiert wird.

Dazu gibt es aber schon ettliche Beiträge.
Rest funktioniert ganz normal wie immer...

lg
 
Ja, bisher alles klar,

nur finde ich keine Version wo ich nur einen Parameter übergeben muss, im Tutorial ist es ja mit zwei:
PHP:
$city = mysqli_real_escape_string($link, $city);
Hab bei meiner Methode eben kein $link definiert.

Grüße,
prinzschleifer
 
Du benutzt oben [phpf]mysql_query[/phpf], also musst du auch [phpf]mysql_real_escape_string[/phpf] verwenden und nicht das MySQLi Pendant.

[phpf]mysql_query[/phpf] erwartet nämlich nur einen Parameter, der zweite ist optional und kann einen Link zur Datenbank entgegennehmen, um anhand des gewählten Zeichensatzes zu kodieren.
 
Also bevor der query gesendet wird einfach
PHP:
$name = mysql_real_escape_string($_POST['name']);
vor jede Variable, die eingetragen wird? Hab ich das richtig verstanden?
 
Also bevor der query gesendet wird einfach
PHP:
$name = mysql_real_escape_string($_POST['name']);
vor jede Variable, die eingetragen wird? Hab ich das richtig verstanden?


Wenn ich mich recht erinnere lässt sich mysql_real_escape_string nur während eines querys ausführen, das hieße folgendes:

PHP:
$name = mysql_real_escape_string($_POST['name']);

geht nicht
stattdessen:
PHP:
$name = $_POST['name'];
mysql_query("INSERT INTO tabelle (name) VALUES ('".mysql_real_escape_string($name)."')")
 
Zuletzt bearbeitet:
Als ob des nen unterschied macht wenn man die Funktion aufruft und den Rückgabewert speichert und später verwendet oder den Rückgabewert direkt mit nem anderen String verkettet. Das ändert doch nichts am Ergebnis....

lg
 
Als ob des nen unterschied macht wenn man die Funktion aufruft und den Rückgabewert speichert und später verwendet oder den Rückgabewert direkt mit nem anderen String verkettet. Das ändert doch nichts am Ergebnis....

lg

Hm jo, habs grad nochmal nachgespielt... wunder mich zwar, da ich überzeugt war den Fehler vor 1-2 Jahren mal gehabt zu haben... aber nunja ;)

Wichtig ist aber natürlich das eine SQL-Verbindung existiert
 
Gerade wenn man in einem Skript mit mehreren Datenbanken gleichzeitig arbeitet, lohnt es sich natürlich, den Linkidentifier an die Funktion zu übergeben, da man sonst leicht in die Bredouille kommt mehrere Zeichensätze zu haben.

Spontan weiß ich nämlich nicht, welche Verbindung [phpf]mysql_real_escape_string[/phpf] nimmt, wenn mehrere offen sind.
 
Zurück