IP-Sperre über .htaccess mit PHP

Brody

Mitglied
IPs sperren mit htaccess und/oder sql auslesen?

Hi online,
nach einigen Stunden Foren suchen und lesen und fragen und weitersuchen, ..... bin ich schlussendlich hier gelandet. Nachdem,was ich hier lese, gibts hier Antworten auf alles, juhu.

Also dann:

Ich lasse 2 Spieleserver laufen und sammle täglich die IPs der Spieler, die auf meinen Servern waren. Diese kommen in eine SQL Datenbank und stehen passwortgeschützt anderen Admins zur Verfügung, die ebenfalls dieses Spiel laufenlassen. Sinn ist, bei Bans alle Ips oder doch zumindest soviel wie möglich von einem Spieler zu haben, um den Ban so sicher und konsequent wie möglich zu gestalten.
Beinahe jeder Spieler verwendet andere Namen um unerkannt zu bleiben, diese Aliase weise ich dann zu.

Somit steigt die Tabelle täglich weiter an, wie Ihr Euch denken könnt. Nun gesamt sind es für 2003 nun 5970 IPs bei ca 450 Spielern. Diejenigen die gebannt sind, möchte ich gleichfalls von meiner Homepage für diesen Spieleserver fernhalten. Derzeit sind es 353 IPs.

Ich habe zunächst mit "htaccess"-dateien versucht, diese 353 IPs auszusperren, dann jedoch versagt der Server seinen Dienst, wegen Serverauslastung. Zusätzlich kommt hinzu, dass man die Aussperrung umgehen kann, sofern man einen Proxy benutzt oder aber einfach eine IP hat, die nicht gesperrt wäre.

Also habe ich mich zum Umkehrschluss entschieden. explizit Erlauben. Ungefähr 5600 IPs wären dann zu erlauben. Nun ist klar, wenn "htaccess" bereits 353 nicht verarbeiten kann zu verbieten, dann 5600 erst recht nicht zum Erlauben.

Die "ipdata" zu benutzen und in php irgendwie eine Kontrolle einbauen. nach dem Motto: "Vergleich die eingehende IP mit der SQL Datenbank. Ist die IP drin, zeig die Homepage, ansonsten verweigere den Zutritt."

Nach langem Surfen durch zig Foren bin ich nun hier. Ich habe mittlerweile herausgehört, dass sowas machbar wäre mit "arrays". Ich sage gleich, dass ich davon gar nix weiss, nicht mal php. Ich hoffe, ich kann hier an ein beispiel kommen, oder aber gar, ich gebe auch gern mal beispielsweise den Namen der SQL Datenbank, den Tabellennamen und die Spaltenbezeichnung ein, damit ich vielleicht ein Beispiel hier bekommen kann?

Ich weiss nicht. Hilfe bitte.

Danke vorab schonmal
Brody
 
Zuletzt bearbeitet:
Das ganze kannst du recht einfach erledigen, indem du ein entsprechendes
SQL-Query sendest.

Das musst du dann in eine Datei packen und diese dann in alle anderen Datei-
en, die gebannte Spieler nicht betreten dürfen includen.

Konkret könnte dass dan z.B. so aussehen:
PHP:
Die Datei, die in alle Seiten includedt wird:
<?php
$iResult = mysql_query("SELECT COUNT(*) AS `anzahl`
                        FROM `allowed_ips`
                        WHERE `ip`='".$_SERVER['REMOTE_ADDR']."';");
$aCount  = mysql_fetch_array($iResult);
if ($aCount['anzahl'] == 0) {
    echo "Du hast leider keine g&uuml;ltige IP!";
    exit;
}
?>

Und der Include, einfach an den Anfang jeder Datei gesetzt:
<?php
require('check_ip.php');
?>

Ps: Noch ein kleiner, freundlicher Hinweis auf die Nettiquette, nämlich der
Groß/Kleinschreibung. Danke ;)

hth
 
Hoi,

erstmal von meiner Seite aus herzlich Willkommen! :) Damit Du Dich etwas besser zurechtfindest, erkläre ich Dir kurz, wie es bei uns abläuft: wir haben eine große Community und da siehst Du bestimmt ein, dass man sich an gewisse Regeln halten muss, damit nicht alles im Chaos versinkt. Kurzum: wer sich an unsere Netiquette http://www.tutorials.de/netiquette.html hält, macht automatisch alles richtig und muss nicht damit rechnen, dass er von einem Mod oder Admin belehrt oder in schlimmeren Fällen sogar richtig zusammengestaucht wird :rolleyes:

Bei Deinem Beitrag fällt mir (und wahrscheinlich nicht nur mir) auf den allerersten Blick auf, dass bis auf Deinen Nicknamen am Schluss alles durchgängig kleingeschrieben ist. Auf sowas achten wir hier ziemlich stark, also von daher bist Du gut beraten, Deinen Beitrag mit der "Editieren"-Funktion entsprechend zu korrigieren.

Danke für die Mühe ;)

PS: Wenn Du schon am Editieren bist, kannst Du auch gleich noch einen aussagekräftigen Betreff für Dein Thema wählen, wie z.B. "IPs mit .htaccess und PHP sperren", dann kann man sogar schon von außen erkennen, worin es in etwa in Deinem Beitrag geht ;-)
 
ehrliche Entschuldigung

Hi online,
ich wusste, hier kann man mir helfen.

Vielen Dank jetzt schon mal. Das sieht ehrlich gut aus, wenngleich mich die Einleitung immer schreckt "Das ist einfach", hihihi.

Sag mal, können wir das am konkreten Beispiel mal machen? Das wäre cool.

Für den Fall, dass, hier die Eckdaten:

SQL Datenbankname Ipdata, Tabellenname Ipdata. Diese weist aus:
Date/Time/IP/Playername/Aliasname

Kann ich jetzt irgendwie mit der php-Datei auf die Spalte "IP" gehen und sie auslesen lassen?

beste Grüße
Brody

oh, PS, Entschuldigung mit der Groß-, und Kleinschreibung, Kommt nicht mehr vor. Diese Regel finde ich übrigens super.
 
Zuletzt bearbeitet:
Hi online,

also ich habe die Beispielphp kopiert und als "allow.php" gespeichert. Gleichermassen das zweite Beispielstück als "access.php".
Die SQL Datenbank heisst "allowonly", die Spalte "IP". Aus Deinem Beispiel habe ich daher "allowed_ips" in "allowonly" umgenannt.

Zunächst habe ich die "access.php" in die "Index.html" geschrieben, wobei die "allow.php" im gleichen Ordner liegt, wie die html-datei.
Dennoch konnten wir drauf.

Ein zweiter Versuch war, die "Index.html" als "Index.php" abzuspeichern. Hierbei bekomme ich dann diese Meldung bei Aufruf:

Warning: mysql_query(): Access denied for user: 'ODBC@localhost' (Using password: NO) in D:\xampp\htdocs\BrodyPants\index.php on line 17
Warning: mysql_query(): A link to the server could not be established in D:\xampp\htdocs\BrodyPants\index.php on line 17
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\xampp\htdocs\BrodyPants\index.php on line 18

Wobei "Sorry, no Access" die von mir eingerichtete Meldung ist. Mein "phpmyadmin" läuft mit Passwortschutz, ist das das Problem?

beste Grüße aus Walluf
Volker Berg
 
Ah, sorry. Du musst natürlich vorher entweder zu MySQL Connecten, oder, noch
besser, die Datei include, die das übernimmt.

Dann z.B. in allen Dateien so:
PHP:
require('mysqlcon.php');
require('allow.php');

Der Nachteil, wenn du die Verbindung in der allow.php extra neu aufbaust, ist
der, dass es dann zwei Verbindungen gibt!
 
Dankeschön,

ich habe es am laufen, allerdings etwas anders. Nunja, ich bin ein vollendeter Newbie, hihihi.

Guck mal bitte.

Das steht in der "allowonly.php":
<?php
$db = mysql_connect($'dbhost', $'dbuser', $'dbpass');
mysql_select_db ($'allowonly') or die ("Cannot connect to database");
$iResult = mysql_query("SELECT COUNT(*) AS `anzahl`
FROM `allowonly`
WHERE `ip`='".$_SERVER['REMOTE_ADDR']."';");
$aCount = mysql_fetch_array($iResult);
if ($aCount['anzahl'] == 0) {
echo "Sorry, no Access!";
exit;
}
?>
Diese lege ich in das Verzeichnis, das geschützt werden soll, und binde in der Index.html ein:
<?
include("allowonly.php");
?>

So läuft es.

Jetzt sag mal, wenn ich verschiedene Verzeichnisse schützen will, kopiere ich die "allowonly.php" in genau die Verzeichnisse und binde jeweils den "include" ein, richtig?
Sofern ich dein letztes Posting richtig verstanden habe, connected dann jedes dieser Verzeichnisse für sich die Datenbank, ja?
Somit wird das wiederrum sehr serverlastig, ja?

Soll ichs dann anders machen? Wie?

Beste Grüsse aus Walluf
Brody
 
Hm... ich habe jetzt zwar keinen Beitrag, der dein Problem löst, aber ich habe mal eine Frage an dich: Ist dir bewusst, dass wahrscheinlich alle oder die meisten deiner Spieler dynamische IPs haben (könnten), und diesen somit bei einem IP-Wechsel (normalerweise bei einer Neueinwahl) der Zugang verweigert wird?

Gruß,
matt
 
Hi online,

ja danke, das weiss ich.

Jedoch stellt das überhaupt kein Problem dar.

Zum einen verfüge ich über eine Datenbank mit 5970 IPs. Allesamt von rund 400 Spielern. Hiervon sind 20 deutsche Spieler, der Rest UK oder USA.
Diese haben ohnehin eine feste IP. Die wenigen Deutschen haben zwar dynamische IP, jedoch ist ein klares Muster ersichtlich. Nachdem ich nun seit April 2003 bis einschliesslich Dezember 2003 die IPs gesammelt habe, weiss ich das absolut sicher. Ausserdem kann ich mit * Platzhaltern arbeiten.
Also das habe ich wirklich schon reiflich durchdacht. Vor diesem Problem stand ich ja auch, als es darum ging, Spieler vom Server zu bannen. Eine äusserst detaillete Liste und IP Range Kontrolle war da ohnehin nötig.

Danke für Deine Nachfrage.

beste Grüsse aus Walluf
Volker Berg
 
Zurück