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!