claus ginsel: PHP: default Zweig in switch will nicht anspringen

Beitrag lesen

Guten Morgen

ich stöbere gerade in der access.log meines Hosters. Und da fielen mir Zugriffe wie folgt auf:

*.*.*.* [24/Mar/2022:00:12:27 +0100] "GET /index.php?kap=/etc/passwd HTTP/1.1" 403 7203 " " "Mozilla/5.0 (Windows NT 10.0; Win64; X64; Rv:85.0) Gecko/20100101 Firefox/85.0"

oder

*.*.*.* [24/Mar/2022:00:12:06 +0100] "GET /index.php?kap=sub HTTP/1.1" 200 7218 " " "Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)"

Im 1. Beispiel hat der Webserver ja richtig reagiert. Aber im 2. Fall sollte eigentlich auch 403 gesetzt werden.

Es ist nur ein GET-Parameter vorgesehen, der ist immer 3 Zeichen lang. Hier das Script dazu:

if(isset($_GET['kap'])) {

	if(strlen($_GET['kap']) > 3 ) exit(header('Status: 403', TRUE, 403));

	// homjhjhj erfüllt sonst case hom

	switch ($_GET['kap']) {
		case "hom": include('kapitel/kap_home.php'); break;

		case "ba1": include('kapitel/kap_basics1.php'); break;

		case "ba2": include('kapitel/kap_basics2.php'); break;

		default: exit(header('Status: 403', TRUE, 403));
	}
}

habe dann probiert mit

if(preg_match('/^[a-z1-6]{3}$/', $_GET['kap'])==false)
exit(header('Status: 403', TRUE, 403));

wurde 403 auch nicht ausgelöst.

Das Problem ist das Leerzeichen im URI, sehe ich das richtig? Wie würdet Ihr die Prüfung durchführen?

Gruß Claus

Edit Rolf B: Code in ~~~php / ~~~ eingeschlossen
Edit Rolf B: IP ist personenbezogen - gelöscht, muss anonymisiert geloggt werden!

akzeptierte Antworten