Files
RTG/webroot/forum/inc/class_stopforumspamchecker.php
2026-06-19 20:08:01 +06:00

231 lines
6.0 KiB
PHP

<?php
/**
* MyBB 1.8
* Copyright 2014 MyBB Group, All Rights Reserved
*
* Website: http://www.mybb.com
* License: http://www.mybb.com/about/license
*
*/
/**
* Registration checker to check registrations against the StopForumSpam.com database.
*/
class StopForumSpamChecker
{
/**
* The base URL format to the stop forum spam API.
*
* @var string
*/
const STOP_FORUM_SPAM_API_URL_FORMAT = 'http://api.stopforumspam.org/api?username=%s&email=%s&ip=%s&f=json&confidence';
/**
* @var pluginSystem
*/
private $plugins = null;
/**
* The minimum weighting before a user is considered to be a spammer.
*
* @var double
*/
private $min_weighting_before_spam = null;
/**
* Whether to check usernames against StopForumSPam. If set to false, the username weighting won't be used.
*
* @var bool
*/
private $check_usernames = false;
/**
* Whether to check email addresses against StopForumSPam. If set to false, the username weighting won't be used.
*
* @var bool
*/
private $check_emails = true;
/**
* Whether to check IP addresses against StopForumSPam. If set to false, the username weighting won't be used.
*
* @var bool
*/
private $check_ips = true;
/**
* Whether to log whenever a user is found to be a spammer.
*
* @var bool
*/
private $log_blocks;
/**
* Create a new instance of the StopForumSpam.com checker.
*
* @param pluginSystem $plugins An instance of the plugin system.
* @param double $min_weighting_before_spam The minimum confidence rating before a user is considered definitely spam.
* @param bool $check_usernames Whether to check usernames against StopForumSpam.
* @param bool $check_emails Whether to check email address against StopForumSpam.
* @param bool $check_ips Whether to check IP addresses against StopForumSpam.
*/
public function __construct(&$plugins, $min_weighting_before_spam = 50.00, $check_usernames = false, $check_emails = true, $check_ips = true, $log_blocks = true)
{
$this->plugins = $plugins;
$this->min_weighting_before_spam = (double)$min_weighting_before_spam;
$this->check_usernames = (bool)$check_usernames;
$this->check_emails = (bool)$check_emails;
$this->check_ips = (bool)$check_ips;
$this->log_blocks = (bool)$log_blocks;
}
/**
* Check a user against the 3rd party service to determine whether they are a spammer.
*
* @param string $username The username of the user to check.
* @param string $email The email address of the user to check.
* @param string $ip_address The IP address sof the user to check.
* @return bool Whether the user is considered a spammer or not.
* @throws Exception Thrown when there's an error fetching from the StopForumSpam API or when the data cannot be decoded.
*/
public function is_user_a_spammer($username = '', $email = '', $ip_address = '')
{
$is_spammer = false;
$checknum = $confidence = 0;
if(!filter_var($email, FILTER_VALIDATE_EMAIL))
{
throw new Exception("stopforumspam_invalid_email");
}
if(!filter_var($ip_address, FILTER_VALIDATE_IP))
{
throw new Exception('stopforumspam_invalid_ip_address');
}
$is_internal_ip = !filter_var(
$ip_address,
FILTER_VALIDATE_IP,
FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
);
if($is_internal_ip)
{
return false;
}
$username_encoded = urlencode($username);
$email_encoded = urlencode($email);
$check_url = sprintf(self::STOP_FORUM_SPAM_API_URL_FORMAT, $username_encoded, $email_encoded, $ip_address);
$result = fetch_remote_file($check_url);
if($result !== false)
{
$result_json = @json_decode($result);
if($result_json != null && !isset($result_json->error))
{
if($this->check_usernames && $result_json->username->appears)
{
$checknum++;
$confidence += $result_json->username->confidence;
}
if($this->check_emails && $result_json->email->appears)
{
$checknum++;
$confidence += $result_json->email->confidence;
}
if($this->check_ips && $result_json->ip->appears)
{
$checknum++;
$confidence += $result_json->ip->confidence;
}
if($checknum > 0 && $confidence)
{
$confidence = $confidence / $checknum;
}
if($confidence > $this->min_weighting_before_spam)
{
$is_spammer = true;
}
}
else
{
throw new Exception('stopforumspam_error_decoding');
}
}
else
{
throw new Exception('stopforumspam_error_retrieving');
}
if($this->plugins)
{
$params = array(
'username' => &$username,
'email' => &$email,
'ip_address' => &$ip_address,
'is_spammer' => &$is_spammer,
'confidence' => &$confidence,
);
$this->plugins->run_hooks('stopforumspam_check_spammer_pre_return', $params);
}
if($this->log_blocks && $is_spammer)
{
log_spam_block(
$username, $email, $ip_address, array(
'confidence' => (double)$confidence,
)
);
}
return $is_spammer;
}
/**
* @param array $sfsSettingsEnabled
*
* @return string
*/
public function getErrorText($sfsSettingsEnabled)
{
global $mybb, $lang;
foreach($sfsSettingsEnabled as $setting)
{
if($setting == 'stopforumspam_check_usernames' && $mybb->settings[$setting])
{
$settingsenabled[] = $lang->sfs_error_username;
continue;
}
if($setting == 'stopforumspam_check_emails' && $mybb->settings[$setting])
{
$settingsenabled[] = $lang->sfs_error_email;
continue;
}
if($setting = 'stopforumspam_check_ips' && $mybb->settings[$setting])
{
$settingsenabled[] = $lang->sfs_error_ip;
continue;
}
}
if(sizeof($settingsenabled) > 1)
{
$lastsetting = $settingsenabled[sizeof($settingsenabled)-1];
unset($settingsenabled[sizeof($settingsenabled)-1]);
$stopforumspamerror = implode($lang->comma, $settingsenabled) . " {$lang->sfs_error_or} " . $lastsetting;
}
else
{
$stopforumspamerror = $settingsenabled[0];
}
return $stopforumspamerror;
}
}