htaccess find und replace IP

Joe

Erfahrenes Mitglied
Hallo Tutorials,

Ich erstelle folgendermaßen eine neue Deny-Regel:
PHP:
$ip = $_SERVER['REMOTE_ADDR'];
		$htaccess = '.htaccess';
		$contents = file_get_contents($htaccess, TRUE) OR die;
		$date   = date('Y-m-d H:i:s');
		$uri    = htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES);
		$agent  = htmlspecialchars($_SERVER['HTTP_USER_AGENT'], ENT_QUOTES);
		$agent  = str_replace(array("\n", "\r"), '', $agent);
		
		// Suche nach IP , wenn vorhanden dannn 403 Forbiddensite anzeigen
		$exists = !stripos($contents, 'deny from ' . $ip . "\n") 
			OR exit(header('HTTP/1.1 403 Forbidden', TRUE));

		// UserIP hat sich geändert
		$ban =  "\n# The IP below was banned on $date for trying to access {$uri}\n";
		$ban .= "# Agent: {$agent}\n";
		$ban .= "# User: {$Username}\n";
		$ban .= "SetEnvIfNoCase REMOTE_ADDR '^{$ip}' bad_bot";
	 
		file_put_contents($htaccess, $ban, FILE_APPEND) 
			  OR exit('Cannot append rule to .htaccess');

Soweit wunderbar und tut auch was es soll.
Nun würde ich gern bei geänderter IP (Die Identifikation ist nicht das Problem) den Eintrag anhand des Usernamens ermitteln und die IP ersetzen.
Ein typischer Eintrag sieht so aus:
HTML:
# The IP below was banned on 2013-06-25 15:41:32 for trying to access /Backend/main.php
# Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
# User: username
SetEnvIfNoCase REMOTE_ADDR '^178.201.11.111' bad_bot

Würde mich freuen wenn ihr mir ein wenig auf die Sprünge helfen könnt um nun die IP zu editieren.

Vielen Dank.
 
1.) An Konfigurationsdateien dynamisch rumzuspielen halte ich für äußerst kritisch.
-> Mach die Sperrung doch lieber rein PHPseitig. Also speichere die IP Adressen in ner Datenbank und sende dann entsprechende HTTP-Header [Not allowed, forbidden]

2.) Was soll das:
PHP:
        // Suche nach IP , wenn vorhanden dannn 403 Forbiddensite anzeigen 
        $exists = !stripos($contents, 'deny from ' . $ip . "\n")  
            OR exit(header('HTTP/1.1 403 Forbidden', TRUE));
Wenn gefunden dann 403? Dieser Client würde doch so oder so von der htaccess Regel vorher schon geblockt werden?

3.) Zum eigentlichen:
Das ist natürlich tricky, da in einem Text die entsprechenden Zeilen zu finden und zu ersetzen. Einfacher wäre wie gesagt eine datenbanktabelle. Wäre der Username (zB bad_bot) denn bekannt? Falls ja, kann man ja relativ leicht diese Zeile finden (vorher mit file() einlesen) und ersetzen.
 
Hallo alxy,

Die htaccess ist notwendig um zb jemanden zu bannen der gern CSS und Javscript dreisst kopiert und auf seiner Seite die das selbe Thema hat als seins präsentiert.
Allerdings würde ich dennoch gern wissen was problematisch daran sein könnte?

Zu 2.ens: Ja stimmt völlig Banane werde ich raus nehmen.

Zu 3.ens:
Ja die Usernamen wären über eine verpöhnte Cookieart bekannt. Das ist leider notwendig und wird nur gesetzt wenn jemand gebannt wurde. Normale User werden nicht damit belästigt.
Die reine IP ist ja meist dynamisch und daher sind beinahe sämtlich Banscripte über htaccess völlig sinnfrei. Hier greift dann bisher nur noch der Header und die DB. Allerdings nützen Header und DB nix bei Neuanmeldungen oder gar CSS-Klau.

Gut also ich bin bisher soweit:
PHP:
		// Serarch and replace IP
		foreach(explode("\n", $contents) as $line) {
			// Suche gebannten User
			if (stristr($line, $bannedUser)) {
				// Suche in der nächsten Line nach der IP
				FILTER_VALIDATE_IP
Im Moment suche ich noch nach einen geigneten replace. Also erstze String mit IP durch neue IP.
 
Zu erstens: Damit rufst du unerwartetes verhalten hervor, dass weder test noch Reproduzierbar ist. Was von IP A zur Zeit x noch geht, ist zur Zeit y nichtmehr möglich.
Außerdem: Du validierst die IP nicht. Dadurch bin ich in der Lage alles mögliche dort hineinzuschreiben (Ich kann deinen Webserver steuern******!)

Zu drittens: Mach es entweder so, wie ich unter 1) beschrieb oder lass es: Lass die Leute deinen CSS oder JS Code doch klauen? Du kannst ihn noch minifizieren (dann ist er nichtmehr lesbar), das bringt doch keinem etwas. Wichtig ist der Content, und falls den jemand klaut wirst du ihn bei Google auf seite 999+ finden ;)
 
War mir garnicht klar das $ip = $_SERVER['REMOTE_ADDR']; manipulierbar ist. Gut werde ich validieren.

Gut ich danke dir für deine Hinweise und werds mir nochmal überdenken. Sollte mir nochmal was zu den Risiken mit htaccess durchlesen.
 
Hab das Problem gelöst. Kann mir noch jemand Tipps zum Thema Sicherheit geben? Sollte man die Datei vorher sperren damit nicht ein gleichzeitiges Schreiben stattfindet? (Modpannel Bann)
Ist IP6 mittlerweile relevant?
PHP:
$ip = $_SERVER['REMOTE_ADDR'];
if(!filter_var($ip, FILTER_VALIDATE_IP)) {
	header("Location: index.php");
	die;
}
$date   = date('Y-m-d H:i:s');
$uri    = htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES);       //brauch ich eventuell später
$agent  = htmlspecialchars($_SERVER['HTTP_USER_AGENT'], ENT_QUOTES);
$agent  = str_replace(array("\n", "\r"), '', $agent);
		
//// Serarch and replace IP
$htaccess = '.htaccess';
$contents = file($htaccess);
foreach($contents as &$line) { // attention: $line is a reference
	if ($true) {
		// Wenn User gefunden dann ersetze IP
		$line = preg_replace('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $ip, $line);
		break;
	}
	// Suche Zeile vom gebannten User
	if (stristr($line, $bannedUser)) {
		// Gefunden: Setze nächste Zeile mit IP auf neue IP
		$true=1;
	}
}
file_put_contents($htaccess, implode("", $contents));
 
Zuletzt bearbeitet:
Zurück