Редирект на главную с ip6

#1 15 октября 2021 в 11:02

Для тех, кто работает с первой веткой. Стоит проверить работу сайта при доступе к нему с ip6 типа 2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d

С некоторых пор стал сталкиваться с тем, что при попытке перемещаться по сайту, все время происходит редирект на главную страницу. Потом проблема исчезает также неожиданно как и появилась.

Пока получается, что дело в этой функции  в user.class.php

  

  1. private function checkSpoofingSession() {
  2.  
  3. // первый раз зашли
  4. if(!isset($_SESSION['user_net'])) {
  5. $octets = explode('.', $_SERVER['REMOTE_ADDR']);
  6. $_SESSION['user_net'] = rtrim($_SERVER['REMOTE_ADDR'], end($octets));
  7. return true;
  8. }
  9.  
  10. return mb_strstr($_SERVER['REMOTE_ADDR'], $_SESSION['user_net']);
  11.  
  12. }

здесь  $octets = explode('.', $_SERVER['REMOTE_ADDR']); рассматривается ip адрес в формате ip4 а далее 

с этой функцией связан редирект

  1. public function update() {
  2.  
  3. // привязка ip адреса к сессии
  4. if(!$this->checkSpoofingSession()){
  5. $this->logout();
  6. cmsCore::redirectBack();
  7. }

Когда я захожу через мобильный МТС там адреса ip6 и вроде как получается вышеупомянутые функции меня отфильтровывают.

 

Столкнулся с этим на 1.10.6, на всякий случай проверил в 1.10.7 не исправлено.

Пока просто закомментировал строки с редиректом

$this->logout();
cmsCore::redirectBack();

если кто-то может подсказать оптимальный вариант замены кода чтобы при проверке учитывать и формат ip6, just do it

#2 15 октября 2021 в 12:29

Возможно нужно ввести переменную $octets2 и разбить адрес не по точке, а по двоеточию и потом сравнивать. Или или

#3 28 октября 2021 в 00:21

 Lora, спасибо)

Посмотрел подробнее всё что может быть связано с этим моментом в системе. Пришёл к выводу, что нормальной заменой будет так:

 

   private function checkSpoofingSession() {
        // первый раз зашли
      if(!isset($_SESSION['user_net'])) {
            $_SESSION['user_net'] =  md5($_SERVER['REMOTE_ADDR']);
            return true;
        }
        return mb_strstr(md5($_SERVER['REMOTE_ADDR']), $_SESSION['user_net']);
    }

 

вместо этого

private function checkSpoofingSession() {
// первый раз зашли
if(!isset($_SESSION['user_net'])) {
$octets = explode('.', $_SERVER['REMOTE_ADDR']);
$_SESSION['user_net'] = rtrim($_SERVER['REMOTE_ADDR'], end($octets));
return true;
}
return mb_strstr($_SERVER['REMOTE_ADDR'], $_SESSION['user_net']);
}

Посмотрю ещё. Может где то обнаружится нарушение связи)

 

Кстати, раз речь зашла про ip6 в таблице cms_users, cms_banlist и в других местах где сохраняем ip стоит увеличит длину поля ip. Сейчас там предел 15, у себя увеличил до 45.

------------------

И кстати, на этом сайте теперь плохо работает цитирование, можно либо ответить с полным цитированием, либо никак. Кнопка цитирования, (кавычки слева перед буквой B) просто вставляет оформленное поле, но раньше можно было выделить фрагмент для ответа и цитировать именно его, сейчас это так не работает.

 

#4 19 марта 2023 в 02:08

Немного переделал, думаю, лучше так, точнее воспроизводится первоначальный замысел но с поправкой на разноформатные ip адреса.

Итого, в файле /core/classes/user.class.php 147 строка вместо оригинального фрагмента

  1. private function checkSpoofingSession() {
  2.  
  3. // первый раз зашли
  4. if(!isset($_SESSION['user_net'])) {
  5. $octets = explode('.', $_SERVER['REMOTE_ADDR']);
  6. $_SESSION['user_net'] = rtrim($_SERVER['REMOTE_ADDR'], end($octets));
  7. return true;
  8. }
  9.  
  10. return mb_strstr($_SERVER['REMOTE_ADDR'], $_SESSION['user_net']);
  11.  
  12. }

вставил это:

  1. private function checkSpoofingSession() {
  2.  
  3. // первый раз зашли
  4. if(!isset($_SESSION['user_net'])) {
  5. $octets = explode('.', $_SERVER['REMOTE_ADDR']);
  6. $_SESSION['user_net'] = rtrim($_SERVER['REMOTE_ADDR'], end($octets));
  7. $_SESSION['u_net'] = md5(md5($_SERVER['REMOTE_ADDR'])) . md5($_SERVER['REMOTE_ADDR']);
  8. return true;
  9. }
  10.  
  11. //return mb_strstr($_SERVER['REMOTE_ADDR'], $_SESSION['user_net']);
  12. return mb_strstr($_SESSION['u_net'], md5($_SERVER['REMOTE_ADDR']));
  13.  
  14. }

61 строка, которую я раньше комментировал, чтобы отключить вызов проверки, вернул к исходному состоянию, то есть такому:

  1. public function update() {
  2.  
  3. // привязка ip адреса к сессии
  4. if(!$this->checkSpoofingSession()){
  5. $this->logout();
  6. cmsCore::redirectBack();
  7. }
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.