#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
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
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
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.
--
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
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
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
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
--
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.
|