MoaByter: Warnung! Beware! Uwaga!

Beitrag lesen

Hallo Rolf B., die Sache mit dem Kontext(-Wechsel) ist mir noch nicht klar, das muss ich noch weiter erforschen. Escape-/Quote? Hm... Bedenke: Ich bin Neuling. Bei C# gibt's sowas meines Wissens nach nicht oder ich hab's nicht gebraucht.

Noch speichere ich die Texte und alles andere in ganz normalen Textdateien, darin habe ich Übung und in C# ist das die einfachste, schnellste Lösung. Da zeigt sich jetzt auch, warum Zeilenumrüche ein Problem darstellen. Ich habe mir gesagt, wenn es auf die Art gut läuft, läuft's auch sonst gut - und eigentlich tut's das ja auch. Das stellt ja auch kein Problem dar, verbessert oder verschlimmert nichts an der Webseite, war mir nur sicherer. Ich 'nehme sie raus, nur was passiert, wenn jemand sich 'nen Request bastelt, der im $_POST z.b. <?php gefährlicher_Code; ?> 'reinschreibt?

Meine Texte schreibe ich alle in Notepadd++, das ist fest auf UTF-8 eingestellt, Unicode geht da gar nicht. Auch in den Formularen ist accept-charset="utf-8" eingestellt, daran kann's also nicht liegen. Ob es mit den Smileys auch ohne Base64 läuft, müsste ich nochmal testen, vielleicht war ein anderer Fehler schuld.

"fachliche Objekte" werde ich wohl erst einsetzen, wenn ich genau weis, was dahinter steckt, dein Beispiel hilft mir da noch(!) wenig, vermutlich später. 🙃

Tja, das error_log...! Ich hatte früher mal phpinfo() gestartet, weil ich die PHP-Version wissen wollte (is' 8.0.27, XAMPP läuft mit 8.2) und mich mit den Server-Einstellungen befasst hatte - sind zuviele. Aber den Eintrag "error_log" habe ich gefunden - Scrennshot hängt an.

if ($treffer)// Nutzername/Passwort ok.
{
	ob_start();
	$sid = trim(substr($s_user, 0, 4), ' {}');
	session_start();
	$_SESSION['user_id'] = $sid;
	$_SESSION['user_nm'] = trim($treffer[1]);
	$insert = "gnDas Einloggen war erfolgreich!";
	#header('Location: pinwand_html.php');
	ob_end_flush();
	include "pinwand_anm_html.php";
	exit;
}

Wie schon erwähnt: Nach der Benutzernamen/Passwortprüfung (ja, mit password_verify) sollte die Seite "pinwand_html,php" aufgerufen werden, aber das tut er nicht. Das exit(); steht jetzt nur für das include... da, damit er nicht mehr den Rest durchläuft. Ohne das exit funktioniert's auch nicht, er verlässt die Seite einfach nicht, ignoriert das Setzen des Headers. (Ob ich das mit dem ob_start(); und ob_end_flush(); richtig gemacht habe, weiß ich nicht. Und sei gewiss, da ist davor nix, was er ausgeben könnte.

Okay, zur Prüfung habe ich also die $_GET- und $_POST- Bearbeitung 'rausgenommen, damit auch die base64_encode(htmlspecialchars(); ... öhm ...

Überraschung:

...tja, funktioniert auch auf dem Server. Jetzt komme ich nun doch schwer ins Grübeln. Die Frage bleibt aber offen, warum sich der XAMPP nicht daran stört, was den strato-Server ins Stolpern bringt? Und: Was ist an dem PHP davor, was das Senden von Daten aktivierte) Hier mal der bisherige Code davor:

<?php
/*array*/	$aa_post = array(); $aa_get = array(); $aa_files = array(); $aa_muster = array(); $a_user = array();
/*string*/	$anm_nm = "default"; $insert = ""; $post_id;
/*int*/		$anm_nm_id = 0;
/*bool*/		$b_post = !empty($_POST); $b_get = !empty($_GET); $b_files = !empty($_FILES); $b_tm = "false";

### $_GET-Übergabe einlesen, schützen
	if (!$b_get)
	{
		foreach ($_GET as $key => $val)
			$aa_get[htmlspecialchars($key)] = htmlspecialchars($val);
	}
	
### bei leerer Übergabe sofort zur Anmeldung
	if (!$b_post)
	{
		include "pinwand_anm_html.php";
		exit;
	}

###  $_POST-Übergabe einlesen, schützen
	if ($b_post)
	{
		$send = htmlspecialchars($_POST["send"]);
		if ($send == "Anmelden" || $send == "Anlegen" || $send == "Speichern")
			foreach ($_POST as $key => $val)
			{
				$key = htmlspecialchars($key);
				if (str_starts_with($key, 'b64_')) $val = base64_encode(htmlspecialchars($val));
				$aa_post[$key] = $val;
				#if (str_starts_with($key, 'hash_')) $aa_post['hash'] = password_hash($val, PASSWORD_DEFAULT);
			}
		else exit;
		$anm_nm_id = $aa_post["nutz_id"]?? 0;
	}
	
### Muster-Datei für verschiedene Zwecke aufrufen
	$aa_muster = unserialize(file_get_contents('muster_nb_assoc_php'));
	$text_id_neu = (int) $aa_muster['int_beiträge_max'] + 1;
	$user_id_neu = (int) $aa_muster['int_nutzer_max'] + 1;
	
### Nutzerdatei laden
	$s_f_nutzer = trim(file_get_contents("nutzer"));
	$insert = "";
	$a_user = explode("}\r\n\r\n{", $s_f_nutzer);

# hier kommt die Namen/Passwort-Prüfung s.o.

So hat den deine Ermahnung - andere gaben sie ja auch schon - sehr geholfen. Jedenfalls hab ich mächtig dazu gelernt und erfahren, dass PHP doch schwieriger ist, als ich dachte. Ich bin da recht blauäugig 'rangegangen: "Was andere können, kann ich auch". Bei C# hat's geklappt, hier wird's das schlussendlich auch.

error_log_strato