IP prüfen und in Datei anhängen

  • Moin, ich wollte einen kleinen Stolperstein bauen, um nur Leute auf einen bestimmten Bereich der Webseite zu lassen, welche ihre IP kopieren und in ein Textfeld einfügen können:
    ip.php


    Der Inhalt soll dann in eine .htaccess angehängt werden und in etwa so ausehen:

    Code
    order deny, allow
    allow from 123.123.123.123
    allow from 2a02:8001:b30e:fb00:b4b4:fe8d:f123:abba
    deny from all

    Jetzt muss ich aber zuvor prüfen, ob es sich um eine IP4/IPv6 handelt, damit nicht gleich der ganze Webserver einen 500 Fehler ausspuckt, wenn jemand z.B. Quarktaschensalat in das Feld schreibt. Da ist der Apache ja sehr empfindlich. In welcher Sprache das passiert ist mir eigentlich egal, in Perl gibts aber schon etwas fertiges für IPv4 und IPv6:

    http://search.cpan.org/~drolsky/Data-…/Validate/IP.pm


    Und da versagen schon wieder meine Programmierkünste :auslachen:
    Ein Beispiel ist zwar schon dabei, aber bei der Umsetzung hakts wieder:


    Also statt 1.2.3.4 soll der Wert aus der ip.php genommen werden, zwischen order deny, allow und deny from all und ein "allow from" vorne angestellt werden:

    Code
    order deny, allow
    allow from "IPv4 aus ip.php" 
    allow from "IPv6 aus ip.php"
    deny from all


    Ich habe schon in einem Perlforum nachgefragt, aber die sind schon an mir verzweifelt. :rolleyes:


    :helpnew: Bin über jede Hilfe dankbar.

    MfG

  • Auch eine gute Möglichkeit, jetzt habe ich schon mal die ip.php, aber wie bekomme ich die .htaccess geöffnet und wie schaffe ich es, dass der vorhandene Inhalt nicht gelöscht wird, sondern zwischen die Zeilen geschrieben wird, also so:

    Code
    order deny, allow
    allow from "IPv4 aus ip.php"
    allow from "IPv6 aus ip.php"
    deny from all


    Hab da mal was gelesen, mit r+ und so weiter, aber ob das klappt ? :s
    http://www.selfphp.de/praxisbuch/pra…te=218&group=38

    Ich müsste ja:
    1.) die Datei öffnen mit fopen(".htaccess","r+");
    2.) nach dem Ausdruck "order deny, allow" suchen mit fseek ?
    3.) einen Zeilenumbruch machen mit < br >
    4.) allow from schreiben, ein Leerzeichen machen mit fprint ?
    5.) die Daten aus dem Formular einfügen, nur wie ?
    6.) Datei speichern, oder geht das automatisch ?
    7.) Datei schliessen mit fclose($datei);

    Fragen über Fragen :geek: und keinen Plan :denker:

  • Meinst Du wirklich es ist eine gute Idee vom Benutzer die .htaccess direkt ändern zu lassen? Wenn da irgendein syntaktischer oder semantischer Fehler auftritt antwortet Dein HTTP Server nur noch mit 500 und ist dead. Ausserdem sollte Dein Code 100% sicher sein denn sonst schleust Dir jemand z.B. per XSS einen Inhalt in Deine .htaccess der ihm unbeschränkten Zugriff auf Deine HTTP Server Dateien gewährt :-/

    Ich würde lieber nach einem anderen Lösungsweg für Dein Problem suchen.

  • Ich habe es jetzt mal so versucht, aber ich bekomme die Ausgabe auf den Schirm, statt in die Datei, was geht denn da schief ?
    ip.php


    ip_test.php

    MfG

  • Erstmal ist "<br>" kein Zeilenumbruch in einer üblichen Datei sondern bestenfalls im HTML-Code für den Browser. Für Dateien ist "\n" als ein Zeilenumbruch zu verwenden.

    fopen("../ip/htaccess/.htaccess","r+");


    Kein Handle ala $fp = fopen ... ?
    Siehe https://secure.php.net/manual/de/function.fopen.php

    fseek("../ip/htaccess/.htaccess", "deny from all", SEEK_CUR);


    Der Dateiname mit Pfad wird nur bei fopen verwendet und danach das Handle. Dazu ist fseek kein Suchbefehl sondern um die Position in der Datei zu verändern um dort zu lesen bzw. schreiben.
    Siehe https://secure.php.net/manual/de/function.fseek.php

    Dokumentation zu den genutzten Befehlen:
    https://secure.php.net/manual/de/function.ftell.php (aktuelle Position in der Datei)
    https://secure.php.net/manual/de/function.fclose.php

    Vermutlich brauchst fwrite um die Daten zu schreiben: https://secure.php.net/manual/de/function.fwrite.php

  • Ich habe die Datei schon wieder gelöscht, weil ich so gefrustet war, nachdem es nicht geklappt hat.
    Auch die error-log habe ich schon wieder geleert, aber ich kann es ja nochmal probieren.
    Leider bin echt zu doof, programmieren zu lernen, obwohl mir die Prinzipien schon klar sind und ich auch schon Programmierkurse belegt habe, irgendwann machts "Knax im Hirn" und nichts geht mehr. :@

  • Mein letzter Versuch sah in etwa so aus:

    Die Fehlermeldung so:

    Code
    PHP Warning:  fseek() expects parameter 1 to be resource, string given in C:\xampp\htdocs\ip\ip_test.php on line 5
    PHP Warning:  fwrite() expects at least 2 parameters, 1 given in C:\xampp\htdocs\ip\ip_test.php on line 9
    PHP Warning:  fwrite() expects at least 2 parameters, 1 given in C:\xampp\htdocs\ip\ip_test.php on line 10
    PHP Warning:  fwrite() expects at least 2 parameters, 1 given in C:\xampp\htdocs\ip\ip_test.php on line 11
    PHP Warning:  fwrite() expects at least 2 parameters, 1 given in C:\xampp\htdocs\ip\ip_test.php on line 12
    PHP Warning:  fclose() expects parameter 1 to be resource, string given in C:\xampp\htdocs\ip\ip_test.php on line 13
  • Code
    $seek = fseek($open, "deny from all", SEEK_CUR);


    fseek ist weiterhin kein Suchbefehl. Es setzt den Zeiger auf die gewünschte Position und die Position ist als Zahl anzugeben. Die Stelle selbst müsste man vorher in der Datei suchen, falls die genaue Position unbekannt ist.


    Die anderen Zeilen sollten etwa so aussehen:

    Code
    fwrite($open,"\n");
    fwrite($open,"allow from ");
    fwrite($open,"$ip");
    fwrite($open,"\n");
    fclose($open);


    PHP Warning: fseek() expects parameter 1 to be resource, string given in ip_test.php on line 5
    PHP Warning: fclose() expects parameter 1 to be resource, string given in ip_test.php on line 13


    Es wird eine so genannte "resource" erwartet und kein Pfad mit Dateiname. Resource als Handle wäre "$open" in deinem letzten Versuch!

    PHP Warning: fwrite() expects at least 2 parameters, 1 given in ip_test.php on line 9


    Gleiche wie obige Meldung und es werden insgesamt 2 Parameter als Übergabe erwartet. In der Regel das Handle und den gewünschten neuen Wert.

  • Ok, leuchtet ein, ich habe das fseek mal komplett rausgenommen.
    Sieht jetzt so aus:


    Die .htaccess wird auch brav befüllt, nur der Zeilenumbruch will nicht
    Die Datei sieht nach dem mehrmaligen Aufruf so aus:

    Code
    order deny,allow
    deny from all
    allow from 1.2.3.4allow from 1.2.3.4allow from1.2.3.4allow from1.2.3.4allow from1.2.3.4allow from1.2.3.4

    P.S.: Noch merkwürdiger: Unter Windows funktionierts, auf meinem Pi nicht.
    Beim Pi bekomme ich die Meldung

    Code
    fwrite() expects parameter 1 to be resource, boolean given
    fclose() expects parameter 1 to be resource, boolean given


    Oops, Schreibfehler... Es geht auch am Pi.

  • Das fopen solltest du auch nur machen, wenn deine if-Bedingung zutrifft. Sonst oeffnest du die Datei, aber schliesst sie nicht. Und "if (! <bedingung> === false)" ist doppeltgemoppelt. " if (<bedingung> === true)" waere besser.

    Der Code fuer den Zeilenumbruch sieht an sich ganz ok aus. Eine Fehlerquelle koennte der Editor sein, mit dem du das anschaust. Kannst du die Datei mal wo hochladen?

  • Jetzt nochmal zur Zusammenfassung:
    Ein User soll per WLAN Zugriff auf ein Verzeichniss in /var/www/ip vom Pi bekommen, dazu muss er die IP seines Geräts freischalten, vorrausgesetzt er hat das WLAN-Passwort.
    Dazu habe ich eine PHP-Seite angelegt:
    ip.php


    Dann noch die ip_test.php :


    Eine Datei .htaccess in /var/www/ip/ mit folgendem Inhalt füllen:

    Code
    order deny,allow
    deny from all


    Die /etc/apache2/sites-available/defaults muss noch angepasst werden, damit die .htaccess auch benutzt wird:
    Unter dem Verzeichnis <Directory /var/www/> den Punkt AllowOverride None zu AllowOverride All ändern.
    Jetzt dürfen nur noch die in der .htaccess vorhandenen IPs auf das Verzeichnis zugreifen.
    :danke_ATDE:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!