View file app/Controllers/BaseController.php

File size: 3.81Kb
<?php

namespace App\Controllers;

use App\Models\Ban;
use App\Models\Error;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Http\Request;

Class BaseController
{
    public function __construct()
    {
        $request = new Request();

        /**
         * Проверка на ip-бан
         */
        if ($ipBan = ipBan()) {

            $ipSplit = explode('.', getIp());

            foreach($ipBan as $ip) {
                $matches = 0;
                $dbSplit = explode('.', $ip);

                foreach($ipSplit as $key => $split) {
                    if (isset($dbSplit[$key]) && ($split === $dbSplit[$key] || $dbSplit[$key] === '*')) {
                        ++$matches;
                    }
                }

                if ($matches === 4 && ! $request->is('banip', 'captcha')) {
                    redirect('/banip');
                }
            }
        }

        /**
         * Счетчик запросов
         */
        if (setting('doslimit') && is_writable(STORAGE . '/antidos')) {

            $dosfiles = glob(STORAGE.'/antidos/*.dat');
            foreach ($dosfiles as $filename) {
                $array_filemtime = @filemtime($filename);
                if ($array_filemtime < (time() - 60)) {
                    @unlink($filename);
                }
            }
            // -------------------------- Проверка на время -----------------------------//
            if (file_exists(STORAGE.'/antidos/'.getIp().'.dat')) {
                $file_dos = file(STORAGE.'/antidos/'.getIp().'.dat');
                $file_str = explode('|', $file_dos[0]);
                if ($file_str[0] < (time() - 60)) {
                    @unlink(STORAGE.'/antidos/'.getIp().'.dat');
                }
            }
            // ------------------------------ Запись логов -------------------------------//
            $write = time().'|'.server('REQUEST_URI').'|'.server('HTTP_REFERER').'|'.getBrowser().'|'.getUser('login').'|';
            file_put_contents(STORAGE.'/antidos/'.getIp().'.dat', $write."\r\n", FILE_APPEND);

            // ----------------------- Автоматическая блокировка ------------------------//
            if (counterString(STORAGE.'/antidos/'.getIp().'.dat') > setting('doslimit')) {

                if (!empty(setting('errorlog'))) {

                    $banip = Ban::query()->where('ip', getIp())->first();

                    if (! $banip) {
                        Error::query()->create([
                            'code'       => 666,
                            'request'    => utfSubstr(server('REQUEST_URI'), 0, 200),
                            'referer'    => utfSubstr(server('HTTP_REFERER'), 0, 200),
                            'user_id'    => getUser('id'),
                            'ip'         => getIp(),
                            'brow'       => getBrowser(),
                            'created_at' => SITETIME,

                        ]);

                        DB::insert(
                            'insert ignore into ban (`ip`, `created_at`) values (?, ?);',
                            [getIp(), SITETIME]
                        );

                        ipBan(true);
                    }
                }

                unlink(STORAGE.'/antidos/'.getIp().'.dat');
            }
        }

        // Сайт закрыт для гостей
        if (setting('closedsite') == 1 && ! getUser() && ! $request->is('register', 'login', 'recovery', 'captcha')) {
            setFlash('danger', 'Для входа на сайт необходимо авторизоваться!');
            redirect('/login');
        }

        // Сайт закрыт для всех
        if (setting('closedsite') == 2 && ! isAdmin() && ! $request->is('closed', 'login')) {
            redirect('/closed');
        }
    }
}