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']);
}
}
}
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