Ansicht:   

#410042

MagicBird

Berlin,
21.03.2017, 11:58:14

Interne Seite durch IP Filtern (web.coding)

Hallo Forum,

auch ich baue mir eine homesteuerung und möchte diese von aussen via passwort und intern dirkt laufen haben.

nun fand ich zu diesem thema ein kleines script aber irgendwie will es nicht so ganz.
Ob ich via Netzwerk oder Internet die datei starte ich bekomme immer "IP nicht bekannt".

<?php

$deny = array("192.168.5.*");
if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) {
   header("location: http://www.google.com/");
   exit();
}
else {
 echo "IP nicht bekannt";
 }

?>



später kommt hier die eigentlich seite rein.

lars

#410043

fuchsi zur Homepage von fuchsi

Niederösterreich,
21.03.2017, 12:25:10
(editiert von fuchsi, 21.03.2017, 12:26:55)

@ MagicBird

Interne Seite durch IP Filtern (ed)

was hast denn überhaupt für einen IP Adresse?

192.168.irgendwas habe ich schon lange nicht mehr gesehen.
Meist 172.16.irgendwas


mach mal ein

echo $_SERVER['REMOTE_ADDR'];



irgendwo am Anfang rein

--
mein privates Hobby. www.ffzell.at

#410044

fuchsi zur Homepage von fuchsi

Niederösterreich,
21.03.2017, 12:30:45

@ MagicBird

Interne Seite durch IP Filtern

>

<?php
> 
> $deny = array("192.168.5.*");
> if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) {
> header("location: http://www.google.com/");
> exit();
> }
> else {
> echo "IP nicht bekannt";
> }
> 
> ?>




das .* hast Du das genau so drin gelassen, oder ist das jetzt auch nur der Platzhalter für Deine IP Adresse.
in_array kann natürlich kein .* auslösen.

--
mein privates Hobby. www.ffzell.at

#410045

Johann

21.03.2017, 12:45:45

@ MagicBird

Interne Seite durch IP Filtern

> 192.168.5.*

Das ist weder eine IP noch eine IP-Range, so kannst Du das nicht machen.
In Deinem Falle würde so was funktionieren:

if(0 === strpos($_SERVER['REMOTE_ADDR'], '192.168.5.')) {
  ... IP in range ...
}
else {
  echo "IP unzulaessig";
}

#410046

bender

Strasshof an der Nordbahn,
21.03.2017, 13:42:26

@ fuchsi

Interne Seite durch IP Filtern

> was hast denn überhaupt für einen IP Adresse?
>
> 192.168.irgendwas habe ich schon lange nicht mehr gesehen.
> Meist 172.16.irgendwas
>

Das sind die Fritzis zumeist. Mein LAN hat schon seit 20 Jahren ein 192.168.0.0-Netz und auch die meisten anderen Baumarktrouter haben eine 192er-Adresse.

--
Grüße aus Strasshof an der Nordbahn (ja, da wo die Natascha im Keller lebte)
bender

sudo apt-get install brain_2.0

#410047

MudGuard zur Homepage von MudGuard

München,
21.03.2017, 14:57:51

@ MagicBird

Interne Seite durch IP Filtern

> $deny = array("192.168.5.*");
> if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) {

in_array führt einen einfachen Vergleich durch.

Deine IP-Adresse ist "192.168.5.1" oder "192.168.5.2" oder "192.168.5.3" oder ... "192.168.5.254". Aber nicht "192.168.5.*".

Also trifft der Vergleich niemals zu.

--
[image]
MudGuard
O-o-ostern

#410048

MagicBird

Berlin,
21.03.2017, 15:36:04

@ fuchsi

Interne Seite durch IP Filtern

Hallo,

das ganze habe ich hier gefunden.

Original Seite

dort steht im 2. Absatz die ganzen IP's und auch das PHP hier das * wohl auflöst oder ersetzt.

naja, lars

#410049

MagicBird

Berlin,
21.03.2017, 15:36:55

@ Johann

Interne Seite durch IP Filtern

> > 192.168.5.*
>
> Das ist weder eine IP noch eine IP-Range, so kannst Du das nicht machen.
> In Deinem Falle würde so was funktionieren:
>

if(0 === strpos($_SERVER['REMOTE_ADDR'], '192.168.5.')) {
> ... IP in range ...
> }
> else {
> echo "IP unzulaessig";
> }



ok, was müsste ich dann bei IP in Range eintragen?

lars

#410050

MagicBird

Berlin,
21.03.2017, 15:38:55

@ fuchsi

Interne Seite durch IP Filtern

Mein ganzes Netzwerk ist mit FestIP's ausgestattet also auch die Smartphone's.

Vor vielen jahren als ich damit anfing hieß es 192.168... sei für den privaten Bereich reserviert naja und wenn Fritchen nun mal auf 172.169....oder so hört naja bitte wichtig ist ja nur das alles schick läuft.

danke lars

#410051

fuchsi zur Homepage von fuchsi

Niederösterreich,
21.03.2017, 15:44:24

@ MagicBird

Interne Seite durch IP Filtern

> Original
> Seite
>
> dort steht im 2. Absatz die ganzen IP's und auch das PHP hier das * wohl
> auflöst oder ersetzt.
>


> Yes, PHP understands wildcard operators (i.e., *).


Nun ja. PHP versteht schon Wildcards. Aber sicherlich nicht im Befehl in_array

--
mein privates Hobby. www.ffzell.at

#410052

fuchsi zur Homepage von fuchsi

Niederösterreich,
21.03.2017, 15:46:18

@ MagicBird

Interne Seite durch IP Filtern

> > > 192.168.5.*
> >
> > Das ist weder eine IP noch eine IP-Range, so kannst Du das nicht machen.
> > In Deinem Falle würde so was funktionieren:
> >

if(0 === strpos($_SERVER['REMOTE_ADDR'], '192.168.5.')) {
> >   ... IP in range ...
> > }
> > else {
> >   echo "IP unzulaessig";
> > }


>
> ok, was müsste ich dann bei IP in Range eintragen?
>
> Lars


nun ja, auf Dein erstes Posting bezogen....
machen wir aber sicherheitshalber niocht eine echo Deiner tatsächlich IP rein


<?php

echo $_SERVER['REMOTE_ADDR'];

if(0 === strpos($_SERVER['REMOTE_ADDR'], '192.168.5.')) {
   header("location: http://www.google.com/");
   exit();
}
else {
 echo "IP nicht bekannt";
 }

?>

--
mein privates Hobby. www.ffzell.at

#410053

bender

Strasshof an der Nordbahn,
21.03.2017, 16:17:07

@ MagicBird

Interne Seite durch IP Filtern

> Mein ganzes Netzwerk ist mit FestIP's ausgestattet also auch die
> Smartphone's.
>
> Vor vielen jahren als ich damit anfing hieß es 192.168... sei für den
> privaten Bereich reserviert naja und wenn Fritchen nun mal auf
> 172.169....oder so hört naja bitte wichtig ist ja nur das alles schick
> läuft.
>
> danke lars

Sind beides private IP-Bereiche.

--
Grüße aus Strasshof an der Nordbahn (ja, da wo die Natascha im Keller lebte)
bender

sudo apt-get install brain_2.0

#410054

MudGuard zur Homepage von MudGuard

München,
21.03.2017, 16:27:40

@ MagicBird

Interne Seite durch IP Filtern

> das ganze habe ich hier gefunden.
>
> Original
> Seite

und weil's im Internet steht, ist's wahr?

> dort steht im 2. Absatz die ganzen IP's und auch das PHP hier das * wohl
> auflöst oder ersetzt.

Ja, ganz bestimmt.

PHP kann wildcards. Bei Funktionen wie glob. Aber nicht in in_array.

Und der Link von der Seite zu den Wildcards geht zu einer Beschreibung von .htaccess-Dateien - die haben nur leider überhaupt nichts mit PHP zu tun.

Naja, wenn eine Seite schon im Domainnamen ihre eigene Verderblichkeit (perishable = verderblich) kundtut ...
Der verlinkte Text war schon vor der Veröffentlichung verdorben ...

Andreas

--
[image]
MudGuard
O-o-ostern

#410055

Johann

21.03.2017, 16:32:17

@ MagicBird

Interne Seite durch IP Filtern

Wie ist denn Dein Konzept bezüglich der Login/Session-Funktionalität?

#410056

MagicBird

Berlin,
21.03.2017, 16:50:58

@ Johann

Interne Seite durch IP Filtern

> Wie ist denn Dein Konzept bezüglich der Login/Session-Funktionalität?

Eigentlich suche ich eine möglichkeit wenn ich unterwegs bin das eine Passwort abfrage kommt, bin ich aber Zuhause und ich möchte dort etwas bedienen soll es direkt laufen.

nutze ich das htaccess habe ich das problem, die RFSniffer kann dann den empfangenen code nicht an die php Datei schicken.

lars

#410057

Johann

21.03.2017, 17:10:16
(editiert von Johann, 21.03.2017, 17:21:38)

@ MagicBird

Interne Seite durch IP Filtern (ed)

> Eigentlich suche ich eine möglichkeit wenn ich unterwegs bin das eine
> Passwort abfrage kommt, bin ich aber Zuhause und ich möchte dort etwas
> bedienen soll es direkt laufen.

Ja, das ist die abstrakte Idee und wie ist das Konzept zur Umsetzung? Kannst Du überhaupt mit PHP generell und seinen Session-Funktionen im speziellen umgehen und eine login/logout Systematik anfertigen? Ich befürchte, Dir fehlen ansonsten die Grundlagen um das Vorhaben durchzuführen.
Prinzipiell musst Du auf der Seite prüfen, ob der Request in IP-Range ist oder nicht und falls nicht: Inkludieren des Session/Login-Scripts, dass Dir im ausgeloggten Zustand ein Login-Formular zur Verfügung stellt, dieses entsprechend bei Absenden behandelt und dann entsprechende Session-Login-Werte setzt. Logout sollte im eingeloggten Zustand dann idealerweise auch möglich sein und der Link dazu irgendwo angezeigt werden. Das ganze setzt mindestens Grund-, wenn nicht Fortgeschrittenenkenntnisse in PHP, HTTP und HTML voraus.

#410058

MagicBird

Berlin,
21.03.2017, 17:33:18

@ Johann

Interne Seite durch IP Filtern

> > Eigentlich suche ich eine möglichkeit wenn ich unterwegs bin das eine
> > Passwort abfrage kommt, bin ich aber Zuhause und ich möchte dort etwas
> > bedienen soll es direkt laufen.
>
> Ja, das ist die abstrakte Idee und wie ist das Konzept zur Umsetzung?
> Kannst Du überhaupt mit PHP generell und seinen Session-Funktionen im
> speziellen umgehen und eine login/logout Systematik anfertigen? Ich
> befürchte, Dir fehlen ansonsten die Grundlagen um das Vorhaben
> durchzuführen.
> Prinzipiell musst Du auf der Seite prüfen, ob der Request in IP-Range ist
> oder nicht und falls nicht: Inkludieren des Session/Login-Scripts, dass Dir
> im ausgeloggten Zustand ein Login-Formular zur Verfügung stellt, dieses
> entsprechend bei Absenden behandelt und dann entsprechende
> Session-Login-Werte setzt. Logout sollte im eingeloggten Zustand dann
> idealerweise auch möglich sein und der Link dazu irgendwo angezeigt werden.
> Das ganze setzt mindestens Grund-, wenn nicht Fortgeschrittenenkenntnisse
> in PHP, HTTP und HTML voraus.

Klares NEIN...keine Kenntnisse.

hatte bisher immer nur Glück das der zusammen geworfene Code auch lief oder wenn es zum Fehler kam Lösungen gefunden hab.

dachte auch nicht, da es eigentlich nur von zuhause aus laufen sollte mit sessions arbeiten zumüssen.

lars

#410060

Johann

21.03.2017, 17:41:37

@ MagicBird

Interne Seite durch IP Filtern

> dachte auch nicht, da es eigentlich nur von zuhause aus laufen sollte mit
> sessions arbeiten zumüssen.

Um alles ausser dem Heimnetz auszusperren genügt eine Zeile aus meinem ersten Post aber die Login-Sache geht nicht ohne. HTTP-Basic-Auth per .htaccess hilft Dir da nicht, weil das eine Funktion vom Webserver selber ist und PHP davon nichts weiß.

#410061

Johann

21.03.2017, 18:43:04
(editiert von Johann, 21.03.2017, 18:57:18)

@ MagicBird

Interne Seite durch IP Filtern (ed)

Du kannst das wie folgt machen, minimale Lösung. Gewünschten Username/Passwort in der if-Bedingung "if($_POST['uname'] == "Username" && $_POST['upass'] == "Passwort")" entsprechend eintragen.

Lege eine Datei "session.php" mit folgendem Inhalt an:

<?php
$logout="";
if(0 === strpos($_SERVER['REMOTE_ADDR'], '192.168.5.')) return;
session_start();
$status="";
if(!isset($_SESSION['login'])) $_SESSION['login'] = false;
if(isset($_REQUEST['action'])) {
  if($_REQUEST['action'] == "login") {
    if($_POST['uname'] == "Username" && $_POST['upass'] == "Passwort") {
      $_SESSION['login'] = true;
      header("Location: " . $_SERVER['PHP_SELF']);
      die;
    }
    else $status="<b>Falsche Zugangsdaten</b>";
  }
  elseif($_REQUEST['action'] == "logout") $_SESSION['login'] = false;
}

if(!$_SESSION['login']) {
?>
<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="utf-8">
    <title>title</title>
    <link rel="stylesheet" href="style.css">
    <script src="script.js"></script>
  </head>
  <body>
    <form method="POST" action="<?php echo $_SERVER['PHP_SELF'];?>">
    <input type="hidden" name="action" value="login"/>
    login: <input type="text" name="uname"/><br/>
    pass: <input type="password" name="upass"/><br/>
    <input type="submit" value="Login"/><br/>
<?php echo $status; ?>
  </form>
</body>
</html>
<?php
  die;
}
else $logout="<a href='?action=logout'>Logout</a>";


Nun setzt Du in jede zu schützende PHP-Datei im gleichen Verzeichnis oben dies ein:

<?php include("session.php"); ?>


Und falls gewünscht in jeder zu schützender Datei irgendwo den eventuellen Logout-Link

<?php echo $logout;?>


Beispielinhalt für eine zu schützende, parallel zur session.php liegende index.php:

<?php include("session.php"); ?>

... hier dein ganzer HTML Krempel ...<br/><br/>
Und irgendwo den Logout Link: <?php echo $logout;?>


Ich schreib normalerweise keinem Zeug für umsonst, nur, damit Du mal siehst, was das mindestens an Überlegung und Aufwand konkret erfordert. Möglicherweise vertiefst Du Deine Kenntnisse für künftige Projekte dieser Couleur, du hast ja immer wieder mal solche oder ähnliche Dinge auf der Pfanne.

#410062

Johann

21.03.2017, 19:01:37
(editiert von Johann, 21.03.2017, 19:02:17)

@ Johann

Nachtrag (ed)

Bitte diese beiden Zeilen in der session.php ersatzlos streichen, die hatte ich übersehen, die sind überflüssig und die max. Edierzeit des Beitrages ist bereits abgelaufen.

<link rel="stylesheet" href="style.css">
<script src="script.js"></script>

#410147

MagicBird

Berlin,
24.03.2017, 14:16:13

@ Johann

Nachtrag

Hallo,

vielen dank, das läuft super.

nun noch eine mysql abfrage damit die eingetragenen Nutzer auch zugrief haben.

DANKE

#410148

Johann

24.03.2017, 14:24:47

@ MagicBird

Nachtrag

> nun noch eine mysql abfrage damit die eingetragenen Nutzer auch zugrief
> haben.

Aber bitte mysql-sicher, damit man keine Injections machen kann. Nicht die Werte "upass" und "uname" ungefiltert/ungeprüft/unsicher in eine DB-Anfrage setzen!

#410149

MagicBird

Berlin,
24.03.2017, 14:42:32

@ Johann

Nachtrag

> > nun noch eine mysql abfrage damit die eingetragenen Nutzer auch zugrief
> > haben.
>
> Aber bitte mysql-sicher, damit man keine Injections machen kann. Nicht die
> Werte "upass" und "uname" ungefiltert/ungeprüft/unsicher in eine DB-Anfrage
> setzen!

ich hoffe richtig zu antworten.

mysqli_real_escape_string()

kommt da rein.

lars

#410155

Johann

24.03.2017, 16:29:36

@ MagicBird

Nachtrag

> mysqli_real_escape_string()

ok

#410158

MagicBird

Berlin,
25.03.2017, 00:16:42

@ Johann

Interne Seite durch IP Filtern

Warum nutze ich eingentlich include und nicht require_once?

<?php include("session.php"); ?>



Lars

#410159

Johann

25.03.2017, 01:06:28
(editiert von Johann, 25.03.2017, 01:14:18)

@ MagicBird

Interne Seite durch IP Filtern (ed)

> Warum nutze ich eingentlich include und nicht require_once?

Ist weniger zu tippen. Grundsätzlich sind require und include identisch, die Fehlerbehandlung ist bei require strenger, siehe.
Das "_once" stellt nur sicher, dass Du das Skript im gesamten Kontext nur einmal eingebunden hast. Gibt auch include_once(), ist das gleiche. Kann man sich normalerweise sparen, vor allem, wenn man Funktionen oder Klassen baut, die fortgeschrittener als das rudimentäre Login/Session-Beispiel sind. Da gibt's beim Deklarationsversuch bereits deklarierter Funktionen sowieso fatal errors. Require oder include wird ohne "_once" auch schneller ausgeführt.

Ansicht:   
Auf unserer Web-Seite werden Cookies eingesetzt, um diverse Funktionalitäten zu gewährleisten. Hier erfährst du alles zum Datenschutz