Problem mit Escape und Datenbank

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
homtata
Beiträge: 1145
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Problem mit Escape und Datenbank

Beitrag von homtata »

Hallo Gemeinde,

folgendes Problem:
- Ich habe für die Frontenduser (FEU) zusätzliche Felder, die letztlich in con_properties landen.
- zum Speichern wird eine Routine im folgenden Stil verwendet:

Code: Alles auswählen

$feuser->setProperty("address", "surname", $variables["nachname"]);
Die nun gespeicherten Werte werden alle mit Backslash escaped, was in der Folge zu größeren Problemen führt - ich müsste das unterbinden. Ich finde nur keinen Weg, dies zu tun.

Alle magic_quotes-Routinen sind abgeschaltet, das zeigt auch die Systemprüfung von Contenido. Das Bereinigen der Originalwerte mit stripslashes (vor dem Aufruf der o.g. Routine) bringt auch nix.

In anderen Modulen verwende ich nicht die setProperty-Speichermethode, sondern normale query-Aufrufe - dort wird nicht escaped. Es scheint also noch irgendwas in Contenido verdrahtet zu sein in gewissen Routinen, die ein Escape durchführen, selbst wenn magic_quotes inaktiv ist...

Ideen?
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Problem mit Escape und Datenbank

Beitrag von xmurrix »

Hallo homtata,

alle Generic-DB Klassen, auch die Eigenschaften eines Frontend-Users, haben vordefinierte Filter zum Schreiben und auslesen der Werte.

Diese Filter sind per default folgende:
- InFilter (schreiben): htmlspecialchars, addslashes
- OutFilter (lesen): stripslashes, htmldecode

Vor dem Schreiben werden die Werte durch die PHP-Funktionen htmlspecialchars() und addslashes() geändert und beim Auslesen wieder mit stripslashes() und htmldecode().

Die Filter sind noch historisch bedingt drin, man kann sie in Generic-DB Klassen deaktivieren, aber das würde ich dir nur für eigene Klassen empfehlen, nicht in den Core-Klassen.

Solange du also die Eigenschaften eines Users mit der Klasse cApiProperty schreibst und liest, sollte es kein Problem sein. Verwendest du aber zum Lesen z. B. eine eigene Routine, dann kann es vorkommen, dass die Werte noch mit Backslashes versehen sind.

Code: Alles auswählen

// Schreiben (verwendet intern cApiProperty)
$feuser->setProperty("address", "surname", $variables["nachname"]);

// Lesen (verwendet intern cApiProperty)
$surname = $feuser->getProperty("address", "surname");
Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
homtata
Beiträge: 1145
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Problem mit Escape und Datenbank

Beitrag von homtata »

Hallo Murat,

da ich es eh schon genau so mache mit speichern und einlesen, wie du beschrieben hast, habe ich alles nochmal gecheckt, und der "Fehler" liegt offensichtlich an einer anderen Stelle.
Während das pure Speichern und Rückauslesen offensichtlich doch ordentlich klappt, werden die $_POST-Variablen bei der Übergabe an eine neue Seite, wo die Werte nochmal dargestellt werden sollen, escaped, so dass auf der Folgeseite die Werte falsch erscheinen, in der DB aber richtig abgelegt werden - das hat mich zu einer falschen Annahme verleitet.
Ich führe jetzt vor der Anzeige der $_Post-Variablen noch mal ein escape auf alle Werte des Array durch, um den Darstellungsfehler zu beheben, und damit funktioniert dann alles wie es soll...

Danke fürs Mitdenken, selbst wenn das Problem falsch beschrieben war - hilft trotzdem ;-)

LG
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Problem mit Escape und Datenbank

Beitrag von xmurrix »

Ok, dann schau dir mal die contenido/includes/globals_off.inc.php an.

Darin ist eine Logik, die je nach PHP-Version und oder der Einstellung magic_quotes_gpc die $_POST, $_GET und $_COOKIE Variablen durch die Funktion addslashes() durchjagt.

Du kannst dann in Modulen z. B. immer die Konstante CON_STRIPSLASHES prüfen, hat sie den Wert true, wurden die Variablen $_POST, $_GET und $_COOKIE mit addslashes() modifiziert, dann kannst es auch mit stripslashes() wieder rückgängig machen. Ich würde das aber nicht global ändern, sondern immer dort, wo man es gerade braucht.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
homtata
Beiträge: 1145
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Problem mit Escape und Datenbank

Beitrag von homtata »

Yep, das hab ich mir auch so gedacht.
Daher jage ich bei Bedarf beliebige Arrays (in meinem Fall $_POST) durch eine Funktion, die das Array manipuliert und auf jeden Wert stripslashes anwendet:

Code: Alles auswählen

function array_stripslashes(&$var)
{
	if(is_string($var))
		$var = stripslashes($var);
	else
		if(is_array($var))
			foreach($var AS $key => $value)
				array_stripslashes($var[$key]);
}
Antworten