Сборка REDL: панель на PHP 8, капча-тумблер, закрытые уязвимости, установщики в один клик

- панель работает на PHP 8.4 (оригинал под PHP 7.0): elFinder utf8_encode, apache_get_modules, warnings
- капча выключена и управляется из админки (флаг captcha_enable + блок настроек)
- закрыты две SQL-инъекции без авторизации (createAuthLog: пароль из POST и CF-Connecting-IP)
- убрано хранение паролей в открытом виде в authlog, XSS в поле ref
- установщики install-panel.sh и install-node.sh (оригинальный затирал sources.list репозиториями Debian 9)
- современный Dockerfile (оригинальный на debian:stretch больше не собирается)
- планировщик и автозапуск работают без systemd
- брендинг REDL.IO, год 2026, ссылки на redl.io
- документация на русском: ИЗМЕНЕНИЯ, БЕЗОПАСНОСТЬ, ИНСТРУКЦИЯ
This commit is contained in:
2026-07-30 02:00:01 +00:00
commit 6ee2744e3a
492 changed files with 354172 additions and 0 deletions
+176
View File
@@ -0,0 +1,176 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
class User {
private $registry;
private $user_id;
private $email;
private $firstname;
private $lastname;
private $balance;
private $access_level;
private $user_img;
private $test_server;
private $user_vk_id;
public function __construct($registry) {
$this->registry = $registry;
if(isset($this->registry->cookie->data['uid'])) {
$query = $this->registry->db->query("SELECT * FROM `users_auth` LEFT JOIN `users` ON users_auth.user_id=users.user_id WHERE `auth_key` = '" . $this->registry->db->escape(@$this->registry->cookie->data['uid']) . "'");
if ($query->num_rows) {
$this->user_id = $query->row['user_id'];
$this->email = $query->row['user_email'];
$this->firstname = $query->row['user_firstname'];
$this->lastname = $query->row['user_lastname'];
$this->balance = $query->row['user_balance'];
$this->access_level = $query->row['user_access_level'];
$this->user_img = $query->row['user_img'];
$this->test_server = $query->row['test_server'];
$this->user_vk_id = $query->row['user_vk_id'];
$this->registry->db->query("UPDATE `users_auth` SET `user_ip` = '" . $this->registry->db->escape($this->getRealIpAdress()) . "', `user_last_activity` = NOW() WHERE `auth_key` = '" . @$this->registry->db->escape($this->registry->cookie->data['uid']) . "'");
} else {
$this->logout();
}
}
}
public function login($email, $password) {
$query = $this->registry->db->query("SELECT * FROM users WHERE user_email = '" . $this->registry->db->escape($email) . "' AND user_password = '" . $this->registry->db->escape($password) . "' AND user_status = '1'");
if($query->num_rows) {
$key = sha1(mt_rand(11111, 99999) . $this->GenerateHash(mt_rand(50, 200)) . microtime()) . sha1(mt_rand(11111, 99999) . $this->GenerateHash(mt_rand(50, 200)) . $query->row['user_password']) . sha1(mt_rand(11111, 99999) . $this->GenerateHash(mt_rand(50, 200)) . $query->row['user_email']) . sha1(mt_rand(11111, 99999) . $this->GenerateHash(mt_rand(50, 200)) . $query->row['user_id']);
$this->registry->cookie->set('uid', $key);
$this->user_id = $query->row['user_id'];
$this->email = $query->row['user_email'];
$this->firstname = $query->row['user_firstname'];
$this->lastname = $query->row['user_lastname'];
$this->balance = $query->row['user_balance'];
$this->access_level = $query->row['user_access_level'];
$this->user_img = $query->row['user_img'];
$this->test_server = $query->row['test_server'];
$this->registry->db->query("INSERT INTO `users_auth` SET `user_id` = '" . $query->row['user_id'] . "', `user_ip` = '" . $this->registry->db->escape($this->getRealIpAdress()) . "', `user_last_activity` = NOW(), `auth_user_email` = '" . $this->registry->db->escape($query->row['user_email']) . "', `auth_user_password` = '" . $this->registry->db->escape($query->row['user_password']) . "', `auth_key` = '" . $this->registry->db->escape($key) . "', `auth_type` = 'Password', `auth_date_add` = NOW()");
return true;
} else {
return false;
}
}
public function loginVk($vkid) {
$query = $this->registry->db->query("SELECT * FROM users WHERE user_vk_id = '" . (int)$vkid . "'");
if($query->num_rows) {
$key = sha1(mt_rand(11111, 99999) . $this->GenerateHash(mt_rand(50, 200)) . microtime()) . sha1(mt_rand(11111, 99999) . $this->GenerateHash(mt_rand(50, 200)) . $query->row['user_password']) . sha1(mt_rand(11111, 99999) . $this->GenerateHash(mt_rand(50, 200)) . $query->row['user_email']) . sha1(mt_rand(11111, 99999) . $this->GenerateHash(mt_rand(50, 200)) . $query->row['user_id']);
$this->registry->cookie->set('uid', $key);
$this->user_id = $query->row['user_id'];
$this->email = $query->row['user_email'];
$this->firstname = $query->row['user_firstname'];
$this->lastname = $query->row['user_lastname'];
$this->balance = $query->row['user_balance'];
$this->access_level = $query->row['user_access_level'];
$this->user_img = $query->row['user_img'];
$this->test_server = $query->row['test_server'];
$this->registry->db->query("INSERT INTO `users_auth` SET `user_id` = '" . $query->row['user_id'] . "', `user_ip` = '" . $this->registry->db->escape($this->getRealIpAdress()) . "', `user_last_activity` = NOW(), `auth_user_email` = '" . $this->registry->db->escape($query->row['user_email']) . "', `auth_user_password` = '" . $this->registry->db->escape($query->row['user_password']) . "', `auth_key` = '" . $this->registry->db->escape($key) . "', `auth_type` = 'Vk', `auth_date_add` = NOW()");
return true;
} else {
return false;
}
}
public function correctData() {
$query = $this->registry->db->query("SELECT * FROM `users_auth` LEFT JOIN `users` ON users_auth.user_id=users.user_id WHERE `auth_key` = '" . $this->registry->db->escape(@$this->registry->cookie->data['uid']) . "'");
if($query->num_rows) {
if($query->row['auth_user_email'] == $query->row['user_email'] && $query->row['auth_user_password'] == $query->row['user_password']) return true;
}
}
public function isLogged() {
if($this->correctData()) {
return $this->user_id;
} else {
$this->logout();
return false;
}
}
public function logout() {
$this->registry->db->query("DELETE FROM `users_auth` WHERE `auth_key` = '" . $this->registry->db->escape(@$this->registry->cookie->data['uid']) . "'");
$this->registry->cookie->remove('uid');
$this->user_id = null;
$this->email = null;
$this->firstname = null;
$this->lastname = null;
$this->balance = null;
$this->access_level = 0;
$this->user_vk_id = null;
}
public function getId() {
return $this->user_id;
}
public function getEmail() {
return $this->email;
}
public function getFirstname() {
return $this->firstname;
}
public function getLastname() {
return $this->lastname;
}
public function getUser_img() {
return $this->user_img;
}
public function getBalance() {
return $this->balance;
}
public function getUser_vk_id() {
return $this->user_vk_id;
}
public function getAccessLevel() {
return $this->access_level;
}
public function getTest_server() {
return $this->test_server;
}
public function getRealIpAdress() {
if (!empty($_SERVER["HTTP_CF_CONNECTING_IP"]) && filter_var($_SERVER["HTTP_CF_CONNECTING_IP"], FILTER_VALIDATE_IP) !== false) {
return $_SERVER["HTTP_CF_CONNECTING_IP"];
}
foreach (array('REMOTE_ADDR', 'HTTP_X_REAL_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED') as $key) {
if (array_key_exists($key, $_SERVER) === true) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
$ip = trim($ip);
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) {
return $ip;
}
}
}
}
return @$_SERVER['REMOTE_ADDR'];
}
private function GenerateHash($length = 12) {
$chars="qazxswedcvfrtgbnhyujmkiolp1234567890QAZXSWEDCVFRTGBNHYUJMKIOLP0!@#$%^&*()_+";
$size = strlen($chars) - 1;
$password = null;
while($length--) {
$password .= $chars[rand(0, $size)];
}
return $password;
}
}
?>