Verständnisfrage: mysql_real_escape_string

campari

Erfahrenes Mitglied
In dem Buch "PHP5 & MySQL5" von Koffler steht, wenn magic_quotes_gpc auf ON und die beiden anderen Modi auf OFF stehen, können "aus Formularen übermittelte Daten ohne Veränderungen in INSERT-Kommandos verwendet werden".

Ok, wenn ich das demnach so befolge:

PHP:
$var = $_POST['var'];
$sqlin = "INSERT INTO $tb (`ID`, `var` ) VALUES ('', '$var',)";
mysql_query($sqlin);

dann landet bei mir die Zeichen " ' \ so wie sie sind in der DB! Nix mit quotiert und so.

Wenn ichs dann mit mysql_real_escape_string versuche, werden sie normal mit Backslashes versehen. Ok.

Aber eigentlich hab ichs so gelernt, dass Formulareingaben auch _immer_ mit htmlentities vercoded werden müssen. In Verwendung mit mysq_real_escape_string landet dann bei Eingabe von " ' \ in meiner DB: \" \' \\! Warum wird vercodedes " gequotet?

Ich steige da irgendwie net durch, wie ich htmlentities, mysql_real_escape_string und stripslashes in Kombination verwenden sollte. :confused:
 
Das liegt wahrscheinlich an der Reihenfolge der Aufrufe der mysql_real_escape_string()- und htmlentities()-Funktion.

Ich nutze die Funktionen wie folgt: die Magic Quotes werden deaktiviert, sodass ich die Daten in ihrer Rohform verarbeiten kann. Bei Zeichenketten wende ich dann die mysql_real_escape_string()-Funktion an, bei Ganzzahlen (rationale Zahlen, ?) die intval()-Funktion, bei Integerzahlen (natürliche Zahlen, ?) zusätzlich die abs()-Funktion. Sollen bei Zeichenketten die HTML-Metazeichen durch Zeichenreferenzen ersetzt werden, wende ich vorher noch die htmlspecialchars()-Funktion an.
Die mysql_real_escape_string()-Funktion muss – wenn überhaupt nötig – immer als letztes angewandt werden.
 
Das liegt wahrscheinlich an der Reihenfolge der Aufrufe der mysql_real_escape_string()- und htmlentities()-Funktion.

Lag es. Danke.

Die mysql_real_escape_string()-Funktion muss – wenn überhaupt nötig – immer als letztes angewandt werden.

Warum "wenn überhaupt nötig"? Einfache und doppelte Anführungszeichen müssen doch auf jeden Fall "entschärft" werden bevor sie mit mysql_query behandelt werden?


Gruss
 
Wenn bei einem Argument ein numerischer Typ erwartet wird und der Wert dementsprechend formatiert/validiert wird (vgl. intval(), floatval(), etc.), gibt es keine gefährlichen Zeichen mehr. Also ist der zusätzliche Einsatz der mysql_real_escape_string()-Funktion auch nicht mehr notwendig. Ähnlich können auch andere Typen und Formate validiert werden.
 
Der Server hat magic_quotes_gpc auf ON stehen.

Nach Gumbos Meinung und anderer hier, sollte man ja auf OFF stellen.
Da kein Zugang auf ini, versuch ichs über die Laufzeit des Scripts.
Aber ich bekomme magic_quotes nicht deaktiviert:
PHP:
ini_set('magic_quotes_runtime', 0);
Wenn ich .htaccess setze, streikt der Server (Not Found)
Code:
php_flag magic_quotes_gpc off
 
magic_quotes_gpc“ und „magic_quotes_runtime“ sind zwei unterschiedliche Konfigurationsoptionen und dürfen nicht verwechselt werden. Denn währen die erste Magic Quotes für per GET- und POST-Methode sowie Cookies übergebene Werte bestimmt, bestimmt die zweite ob auch beliebige Funktionen während der Laufzeit eines Skriptes Magic Quotes anwenden sollen. Bitte nicht verwechseln!
 
Ja, Flüchtigkeitsfehler.
Trotzdem keine Reaktion, wird immer als on gezeigt:

PHP:
ini_set('magic_quotes_gpc', 0);

if (get_magic_quotes_gpc()) {
	$strip = "magic_quotes sind on";
	} else {
	$strip = "magic_quotes sind off";
	}

echo $strip
 
Die magic_quotes_gpc-Konfigurationsoption kann nicht während der Laufzeit verändert werden sondern nur im „Per directory“- oder Systemkontext also in einer „.htaccess“- beziehungsweise der „php.ini“-Konfigurationsdatei.
 
Mit anderen Worten, ich hab keine Chance fuer meine Scripte magic_quotes auf Off zu sezten?
Weil gegen .htaccess scheint der Provider was zu haben.
 
Du könntest deinen Anbieter fragen, ob er diese Einstellung für dich deaktiviert. Das sollte eigentlich kein Problem sein. Und falls doch, solltest du den Anbieter wechseln, zu mal dir noch nicht einmal „.htaccess“-Dateien zur Verfügung stehen.
Falls du allerdings ein Kostenlos-Angebot in Anspruch nimmst, ist das natürlich etwas ganz anderes.
 
Zurück