Pagina 1 van 1

Ban aanpassing

Geplaatst: 14 dec 2005, 18:41
door Lontronics
Op een van mijn forums zijn een aantal delen afgeschermd voor gasten.
Wanneer gasten deze forumdelen bekijken, zien ze wel de topics staan maar wanneer de topics worden aangeklikt verschijnt een bericht dat ze in moeten loggen met een link (eigen mod).

Nu bleek echter dat er mensen zo creatief zijn dat ze via de login naam van een ander inloggen, oftewel misbruik.
Ik wilde geen gebruik maken van de normale ban die iedereen van het forum weert, echter een controle die kijkt of een user_ip of user_id uit de banlist wordt gebruikt in combinatie met een login. Zoja, dan wordt de gebruiker weer uitgelogd en kan dus als gast de toegestane delen van het forum bezoeken.

Ik heb hiervoor het volgende gedaan:

Code: Selecteer alles

## AUTOMATISCH UITLOGGEN VAN MENSEN DIE MET HUN USERNAAM OF USERIP IN DE BANLIST STAAN
## ALS VERVANGER VOOR DE ORIGINELE BAN;

- /forum/includes/sessions.php:
Verwijder de originele code t.b.v. ban (ca. regel 124 t/m 149):

	//
	// Initial ban check against user id, IP and email address
	//
	preg_match('/(..)(..)(..)(..)/', $user_ip, $user_ip_parts);

	$sql = "SELECT ban_ip, ban_userid, ban_email 
		FROM " . BANLIST_TABLE . " 
		WHERE ban_ip IN ('" . $user_ip_parts[1] . $user_ip_parts[2] . $user_ip_parts[3] . $user_ip_parts[4] . "', '" . $user_ip_parts[1] . $user_ip_parts[2] . $user_ip_parts[3] . "ff', '" . $user_ip_parts[1] . $user_ip_parts[2] . "ffff', '" . $user_ip_parts[1] . "ffffff')
			OR ban_userid = $user_id";
	if ( $user_id != ANONYMOUS )
	{
		$sql .= " OR ban_email LIKE '" . str_replace("\'", "''", $userdata['user_email']) . "' 
			OR ban_email LIKE '" . substr(str_replace("\'", "''", $userdata['user_email']), strpos(str_replace("\'", "''", $userdata['user_email']), "@")) . "'";
	}
	if ( !($result = $db->sql_query($sql)) )
	{
		message_die(CRITICAL_ERROR, 'Could not obtain ban information', '', __LINE__, __FILE__, $sql);
	}

	if ( $ban_info = $db->sql_fetchrow($result) )
	{
		if ( $ban_info['ban_ip'] || $ban_info['ban_userid'] || $ban_info['ban_email'] )
		{
			message_die(CRITICAL_MESSAGE, 'You_been_banned');
		}
	}

- /forum/includes/page_header.php:
Zoek (ca.regel 70):

//
// Parse and show the overall header.
//
$template->set_filenames(array(
	'overall_header' => ( empty($gen_simple_header) ) ? 'overall_header.tpl' : 'simple_header.tpl')
);

Voeg hieronder toe:

//
// Start auth check; when user_id or user_ip is found in the ban list , the user is logged out
// This is used to prevent banned users to login under another name from a friend for example
//
if ( $userdata['session_logged_in'] )
{
	$user_id = $userdata['user_id'];
	$sql = "SELECT ban_ip, ban_userid, ban_email 
		FROM " . BANLIST_TABLE . " 
		WHERE ban_ip = '$user_ip'
		OR ban_userid = '$user_id'";

	if ( !($result = $db->sql_query($sql)) )
	{
		message_die(CRITICAL_ERROR, 'Could not obtain ban information', '', __LINE__, __FILE__, $sql);
	}

	if ( $ban_info = $db->sql_fetchrow($result) )
	{
		if ( $ban_info['ban_ip'] || $ban_info['ban_userid'] || $ban_info['ban_email'] )
		{
			session_end($userdata['session_id'], $userdata['user_id']);
			unset($userdata['session_logged_in']);
		}
	}
}
[/size]

Mijn vraag is echter de volgende:

Waarom wordt het banbeheer standaard in sessions.php gebruikt en niet in de header?
Ik heb e.e.a. nl. ook via sessions.php geprobeerd, maar dit gaf niet het gewenste resultaat. En toen zo nadenkende vroeg ik mij af waarom e.e.a. niet gewoon in de header wordt afgehandeld.
Het voordeel hiervan is dat bij elke pageview wordt gecontroleerd.
Het nadeel natuurlijk iets meer sql belasting.

Overigens ban ik dus niet meer op emailadres, voordat iemand me hier zeer oplettend op wijst ;)

Jan

Re: Ban aanpassing

Geplaatst: 14 dec 2005, 19:08
door mosymuis
Lontronics schreef:Het nadeel natuurlijk iets meer sql belasting.
Daar geef je je verklaring. Overigens werkt alles op sessie, zou je je phpbb_session tabel leegmaken dan start de functie mét bancheck voor iedereen opnieuw.

Geplaatst: 14 dec 2005, 19:14
door Paul
En zowiezo wordt wanneer er een ban wordt aangemaakt, de sid verwijderd, en anders wordt er na 5 minuten nogmaals gecontroleerd, omdat de sessie dan wordt geupdated.

Geplaatst: 14 dec 2005, 19:15
door mosymuis
paulus schreef:en anders wordt er na 5 minuten nogmaals gecontroleerd, omdat de sessie dan wordt geupdated.
Dat gebeurt in een andere functie. Verder heb je gelijk.

Geplaatst: 14 dec 2005, 19:17
door Lontronics
Hallo Mosy,

Toch een vraagje over jouw opmerking aangaande de phpbb_session tabel.

Je hebt gelijk dat dan idd de gehele functie opnieuw gestart wordt.
Maar als ik het zo inschat zou dit minder efficient zijn dan wat ik nu doe; simpelweg omdat gasten dan ook uit de sessietabel worden gegooid.
Bovendien wordt het bezoekersaantal dan niet meer juist weergegeven.

Heb jij hier dezelfde ideeen over, of had je iets anders in gedachten?

Jan

Geplaatst: 14 dec 2005, 19:19
door Lontronics
@Paulus: w.b. die 5 minuten; dat is de standaard uitvoering ;)

Op het forum waar ik het nu over heb staat dit op een half uur.

Jan.

Geplaatst: 14 dec 2005, 19:22
door Paul
Het klopt niet eens wat ik zei, na bestudering van sessions.php, enkel de SID wordt verwijder in admin_user_ban.php, daarna wordt nieuwe aangemaakt, met check, maar als de SID nog besstaat, wordt er geen check gedaan op bans, enkel hem geupdated.

En, ik kan me bijna niet voorstelen, dat een sessie maar een keer per half uur wordt geupdated.

Geplaatst: 14 dec 2005, 19:27
door Lontronics
Ik ging er vanuit dat we het hadden over de sessielengte uit de config.
Verder had ik nog niet gekeken ;)

Maar het viel me iig op dat bij het bannen via sessions.php een ban niet direct actief was na het toevoegen. Ik kon het gehele forum over zonder dat er ik gebanned werd.
Pas na uitloggen/ inloggen werd de ban actief.

Jan

Geplaatst: 14 dec 2005, 19:30
door Paul
Bande je op username/ip? Want daarbij worden alle sessies verwijderd die aan dat IP/username mee ingelogt zijn in admin_user_ban.php

Geplaatst: 14 dec 2005, 19:32
door Lontronics
user_ip ;)

Maar Paulus, op zich ben ik tevreden met mijn oplossing dus maak je niet te druk :bier:

Ik heb echter niets gemerkt van het verwijderen van sessies.
Dit wordt gedaan wanneer de ban_ip wordt opgeslagen?

Jan

Geplaatst: 14 dec 2005, 19:41
door Paul

Code: Selecteer alles

		if ( !$in_banlist )
		{
			if ( preg_match('/(ff\.)|(\.ff)/is', chunk_split($ip_list[$i], 2, '.')) )
			{
				$kill_ip_sql = "session_ip LIKE '" . str_replace('.', '', preg_replace('/(ff\.)|(\.ff)/is', '%', chunk_split($ip_list[$i], 2, "."))) . "'";
			}
			else
			{
				$kill_ip_sql = "session_ip = '" . $ip_list[$i] . "'";
			}

			$kill_session_sql .= ( ( $kill_session_sql != '' ) ? ' OR ' : '' ) . $kill_ip_sql;

			$sql = "INSERT INTO " . BANLIST_TABLE . " (ban_ip)
				VALUES ('" . $ip_list[$i] . "')";
			if ( !$db->sql_query($sql) )
			{
				message_die(GENERAL_ERROR, "Couldn't insert ban_ip info into database", "", __LINE__, __FILE__, $sql);
			}
		}
Het wordt dus verwijderd bij het maken van een ban.

Geplaatst: 14 dec 2005, 19:46
door Lontronics
Kan het dan zijn dat de reden is dat ik het met mijn eigen IP adres heb getest ? :?

Geplaatst: 14 dec 2005, 19:52
door Paul
Hmm, nee lijkt me niet.