Zur Navigation

$_GET mit .htaccess absichern

1 MS (Gast)

Hallo

Ich übergebe auf meiner HP Variablen, zb. index.php?datum=2022-08-30
Ich prüfe die Variable vorher auf Gültigkeit ob es sich um ein Datum handelt.
Wenn jetzt jemand das aber so macht,
index.php?datum=%27%27;eval(%22?3E%3Cscript%3Ealert(%27das%20ist%20schon%20hacken%27);%3C/script%3E%3C?php%22);
dann bekomme ich unter xampp eine Fehlermeldung.
Aber auf meiner HP keine. Da es schon sehr lage her ist, glaube ich das es ein Code in der .htaccess ist.
RewriteEngine on
RewriteCond %{QUERY_STRING} http[:%] [NC]
RewriteRule .* /------------http----------- [F,NC]
RewriteRule http: /---------http----------- [F,NC] 
Kann das dieser Code sein?
Und wenn ja, ist das ausreichend?
mfg
Michael

30.08.2022 18:16

2 Jörg Kruse

Ich prüfe die Variable vorher auf Gültigkeit ob es sich um ein Datum handelt.

Wie überpüfst du die Variable, mit filter_input() ?

dann bekomme ich unter xampp eine Fehlermeldung

Wie ist der genaue Wortlaut dieser Fehlermeldung?

RewriteEngine on
RewriteCond %{QUERY_STRING} http[:%] [NC]
RewriteRule .* /------------http----------- [F,NC]
RewriteRule http: /---------http----------- [F,NC] 

Kann das dieser Code sein?

Der wirkt sich nur auf URLs aus, die ein "http:" bzw. "http%" im Pfad oder im Query String enthalten.

Wenn du $_GET['datum'] im PHP-Code ordentlich validierst, sollte das ausreichend sein und auch effektiver als URLs mit potentiell gefährlichen Strings in der .htaccess Datei zu blockieren

30.08.2022 18:39

3 MS (Gast)

Hallo

Danke

hier mal der Code, ist noch ein Test

if ((isset($_GET['datum'])) && (!empty($_GET['datum']))) { //bedeutet ja: ist die Variable da und ist sie befüllt
    $datum = htmlspecialchars($_GET['datum'], ENT_QUOTES); /* alt $datum = $_GET["datum"]; */
    $reg = "/^([0-9+]{4})-([0-9+]{2})-([0-9+]{2})$/";
    if (preg_match($reg, $datum, $match) && checkdate($match[2], $match[3], $match[1])) {
        if (file_exists("$verzeichnisszaehler/$datum.txt")) {
            $countert = file_get_contents("$verzeichnisszaehler/$datum.txt");
            $countert++;
        } else {
            $countert = 1;
        }
        file_put_contents("$verzeichnisszaehler/$datum.txt", $countert);
    } else {
        if (file_exists("$verzeichnissfehler/fehler-$datum.txt")) {
            $countert = file_get_contents("$verzeichnissfehler/fehler-$datum.txt");
            $countert++;
        } else {
            $countert = 1;
        }
        file_put_contents("$verzeichnissfehler/fehler-$datum.txt", $countert);
    }
}

unter xampp
Warning: file_put_contents(seitenzaehler/fehler/fehler-index.php?datum='';eval("?><script>alert('das ist schon hacken');</script><?php");.txt): Failed to open stream: No such file or directory in \xampp\htdocs\zaehler.php on line 29

Wenn ich diesen Test Fehler Code auf meiner HP teste gibt es keine Fehlermeldung. Das ist aber nicht der Code hier sondern die ganz normale Seite.

mfg
Michael

30.08.2022 19:50

4 Jörg Kruse

Die Filterung von $datum mithilfe von preg_match() und der Funktion checkdate() wirkt sich nur auf den if Block aus, im else Block ist $datum weiterhin ungefiltert.

Das ist vermutlich Zeile 29, die in der Fehlermeldung angekreidet wird (?):

file_put_contents("$verzeichnissfehler/fehler-$datum.txt", $countert);

Soll $datum hier wirklich alles mögliche enthalten können? je nachdem, wie die betreffenden Dateien weiterverarbeitet werden, kann dies schon das eine oder andere Sicherheitsloch eröffnen. Ich würde den String zumindest auf das Zeicheninventar [A-Za-z0-9_-] begrenzen.

30.08.2022 20:25 | geändert: 30.08.2022 20:30

5 MS (Gast)

Hallo

Danke,

Da ganze wird ein Seitenzähler und im else Block soll ja dann genau so etwas stehen. Es wird jeweils eine txt Datei für die Seite oder die Fehle-txt Datei erstellt.
Das hatte ich schon in einem anderen Forum gefragt, mir ging es nur darum, warum diese Fehlermeldung auf meiner HP nicht erscheint und ob es mit der .htaccess etwas zu tuen hat. Das konnte man mit dort nicht sagen.
Aber wenn es Funktioniert ist es ja ok.

mfg
Michael

31.08.2022 06:45

6 Jörg Kruse

Je nachdem, was in $_GET['datum'] drin steht, funktioniert dies eben nicht immer, wie gewünscht. Dies eröffnet ggf. auch Angriffspunkte. In so einem Fall landet die Fehlerdatei z.B. woanders, wenn darüberliegende Verzeichnisse beschreibbar sind:

index.php?datum=/../../test

Ich würde deswegen davon abraten, die Variable ungefiltert in die Dateinamen zu schreiben. Besser und sicherer wäre es, diese in eine (Log-)Datei zu schreiben.

mir ging es nur darum, warum diese Fehlermeldung auf meiner HP nicht erscheint

Das kann unterschiedliche Gründe haben. Ist PHP auf der Homepage so eingestellt, dass es die Fehlermeldungen auf der Seite direkt ausgibt oder werden diese dort nur geloggt?

Das Betriebssystem könnte hier auch ein Rolle spielen. Ich nehme an, XAMPP läuft bei dir unter Windows? Zwischen Windows und Linux gibt es unterschiedliche "Empfindlichkeiten", was Dateinamen anbelangt.

31.08.2022 09:39 | geändert: 31.08.2022 09:43

7 MS (Gast)

Hallo

Danke für die Infos

Was da auf der HP eingestellt ist, keine Ahnung.
Das ist W10 und xampp, ist ja nur zum testen bevor ich es Online stelle.

Ich wollte ja nur sehen, wenn ein Angiff Versucht wurde.
Aber ich kann das auch mit einer gestzten Variable machen, wenn es eine Falsche Eingabe gibt.
ZB. else { $fehler = 1

mfg
Michael

31.08.2022 11:44

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]