Lieber Felix Riesterer,
'\'%1$s\'
Die Zeichenkette versteh ich gerade noch nicht vollständig. Dass
sollte den übergebenen String beinhalten, das erstes
dann hier$_SESSION['user_name']
usw. . Aber was macht das\'%1$
.wenn Du bei PHP.net nachgelesen hast, das die Funktion
sprintf
Ersetzungen in Strings vornehmen kann, dann hast Du sicher gesehen, dass es nicht nur dass
ist, sondern die Zeichenfolge%s
. Man kann die Platzhalter mit Nummern versehen, um einen Teilstring, der öfter eingesetzt werden soll, nicht öfter in der Parameterliste notieren zu müssen:sprintf( 'Wir haben %1$ %1$ %1$ haben %1$ %1$ %1$ haben %1$ %1$ %1$ haben %2$!', 'Hunger', 'Durst' );
Wenn in Deinem SQL-String der Wert in einfache Quotes verpackt werden soll, dann müssen diese mit einem Backslash escaped werden, da sonst Syntaxfehler entstehen:
sprintf( 'Wir haben '%1$' '%1$' '%1$' haben '%1$' '%1$' '%1$' haben '%1$' '%1$' '%1$' haben '%2$!'', 'Hunger', 'Durst' );
Deshalb diese Schreibweise:
sprintf( 'Wir haben \'%1$\' \'%1$\' \'%1$\' haben \'%1$\' \'%1$\' \'%1$\' haben \'%1$\' \'%1$\' \'%1$\' haben \'%2$!\'', 'Hunger', 'Durst' );
Natürlich wie konnte ich nur so blind sein. Danke für die ausführliche Erklärung.
Wenn ich jetzt aber einfach mal sage das:
if($_POST) { foreach($_POST as $key=>$value) { $_POST[$key]= mysqli_real_escape_string($value); } }
Dann kommt ja z.b. ein
'
garnicht durch als$_POST
variable oder nicht?Warum willst Du alle geposteten Werte für den SQL-Kontext kodieren? Solltest Du eine Fehlermeldung ins Dokument schreiben, bei der Du etwas bemängelst, dann kannst Du den originalen Wert nicht mehr rekonstruieren:
Hm, eigentlich dachte ich alle Variablen die Irgendjemand eingibt schonmal vorab entschärfen.
$_POST['lang'] = 'Leck mich!'; if (!in_array($_POST['lang'], $available_languages) { // create error message $error = sprintf( '<p class="error">Falsche Sprache <strong>%1$s</strong>angegeben!</p>', htmlspecialchars($_POST['lang']) ); }
Das wird wohl nicht passieren, da die $_POST['lang']
aus der Datenbank gefüllt wird. Außer jemand fummelt an der $_SESSION
variable rum, dann kommt er garnicht erst bis zu dem Punkt und die $_SESSION
wird sofort beendet Und man müsste sich neu Einloggen.
Man kodiert genau dort, wo man es benötigt. Im obigen Beispiel wird der gepostete Wert für den HTML-Kontext kodiert. Der Wert im
$_POST
-Array wird dabei aber nicht verändert, damit er an anderer Stelle wieder original zur Verfügung steht und für den dortigen Kontext passend kodiert werden kann (z.B. mitmysqli_real_escape_string
). Das stand aber in dem von mir verlinkten und zur Lektüre ans Herz gelegten Artikel... ;-)
Da hab ich schon drübergelesen, werde ich auch nochmal eingehender machen.
Gruß Jo