]+href\s*=\s*['\"])(((?!'|\"|https?://).)*)(['\"][^>]*>)-i";
$text = preg_replace( $regex, "$1" . $base . "://" . $_SERVER['SERVER_NAME'] . "$2$4", $text );
// $send = \S::send_email( $email, $lang['potwierdzenie-aktywacji-konta-w-portalu'] . ' GLOBELUS.PL', $text );
}
return true;
}
public static function signup( $email, $password, $type, $agremment_profile, $agremment_marketing, $automatic_register = 0, $name ='', $surname = '', $phone = '', $cv_file = null, $cv = null, $cv_extension = null, $auto_create = 0 )
{
global $mdb, $lang, $settings;
$result = [ 'status' => 'bad', 'msg' => $lang['rejestracja-blad-ogolny'] ];
// ============ ZABEZPIECZENIA ANTYSPAMOWE ============
// 1. HONEYPOT - sprawdzenie ukrytego pola
$honeypot = \S::get( 'website' );
if ( !empty( $honeypot ) )
{
// Bot wypełnił ukryte pole - odrzuć rejestrację
self::log_bot_detection( 'HONEYPOT', [
'ip' => $_SERVER['REMOTE_ADDR'],
'email' => $email,
'reason' => 'Honeypot field filled'
]);
return [ 'status' => 'bad', 'msg' => 'Wystąpił błąd podczas rejestracji. Spróbuj ponownie.' ];
}
// 2. TIME-BASED VALIDATION - sprawdzenie minimalnego czasu wypełniania
$form_timestamp = \S::get( 'form_timestamp' );
if ( $form_timestamp )
{
$time_elapsed = time() - intval( $form_timestamp );
if ( $time_elapsed < 3 ) // Minimalny czas: 3 sekundy
{
self::log_bot_detection( 'TIME_BASED', [
'ip' => $_SERVER['REMOTE_ADDR'],
'email' => $email,
'time_elapsed' => $time_elapsed . 's',
'reason' => 'Form filled too fast'
]);
return [ 'status' => 'bad', 'msg' => 'Formularz został wypełniony zbyt szybko. Proszę wypełnić ponownie.' ];
}
}
// 3. RATE LIMITING - ograniczenie liczby rejestracji z jednego IP
$user_ip = $_SERVER['REMOTE_ADDR'];
$time_window = 3600; // 1 godzina w sekundach
$max_registrations = 3; // Maksymalnie 3 rejestracje na godzinę z jednego IP
// Sprawdzenie liczby rejestracji z tego IP w ostatniej godzinie
$recent_registrations = $mdb -> count( 'globelus_users', [
'AND' => [
'register_ip' => $user_ip,
'register_date[>=]' => date( 'Y-m-d H:i:s', time() - $time_window )
]
]);
if ( $recent_registrations >= $max_registrations )
{
self::log_bot_detection( 'RATE_LIMIT', [
'ip' => $user_ip,
'email' => $email,
'registrations_count' => $recent_registrations,
'reason' => 'Rate limit exceeded'
]);
return [ 'status' => 'bad', 'msg' => 'Przekroczono limit rejestracji. Proszę spróbować później.' ];
}
// ============ STANDARDOWE WALIDACJE ============
if ( \S::strpos_arr( $email, [ 'UNION', 'SELECT', 'ORDER BY', 'AND' ] ) )
return false;
if ( $mdb -> count( 'globelus_users', [ 'email' => $email ] ) )
{
if ( $type == 1 )
return $result = [ 'status' => 'bad2', 'msg' => 'Masz już u nas konto :) Przejdź do logowania.' ];
else
return $result = [ 'status' => 'bad2', 'msg' => 'Masz już u nas konto :) Przejdź do logowania.' ];
}
$hash = md5( time() . $email );
$register_date = date('Y-m-d H:i:s');
$register_ip = $_SERVER['REMOTE_ADDR'];
$mdb -> insert( 'globelus_users', [
'email' => $email,
'password' => md5( $register_date . $password ),
'hash' => $hash,
'type' => $type,
'user_agremment_profile' => $agremment_profile == 'on' ? 1 : 0,
'user_agremment_marketing' => $agremment_marketing == 'on' ? 1 : 0,
'register_date' => $register_date,
'register_ip' => $register_ip,
'active_to' => date( 'Y-m-d', strtotime( '+90 days', time() ) ),
'auto_create' => $auto_create
] );
$user_id = $mdb -> id();
if ( $user_id )
{
if ( $automatic_register )
{
$mdb -> insert( 'globelus_candidates_data', [ 'user_id' => $user_id ] );
$text = $settings['newsletter_header'];
$text .= \front\factory\Newsletter::get_template( '#globelus-potwierdzenie-automatycznej-rejestracji' );
if ( $type == 0 )
$text .= '' . $lang['rejestracja-kandydat-ostrzezenie'] . '
';
if ( $type == 1 )
$text .= '' . $lang['rejestracja-pracodawca-ostrzezenie'] . '
';
$text .= $settings['newsletter_footer_1'];
$settings['ssl'] ? $base = 'https' : $base = 'http';
$regex = "-(
]+src\s*=\s*['\"])(((?!'|\"|https?://).)*)(['\"][^>]*>)-i";
$text = preg_replace( $regex, "$1" . $base . "://" . $_SERVER['SERVER_NAME'] . "$2$4", $text );
$regex = "-(