xenForo 2.2.17 Release Edition By XenForo.Info

xenForo 2.2.17 Release Edition By XenForo.Info 2.2.17

Нет прав для скачивания
XenForo 2.2.17 теперь доступен для скачивания. Мы рекомендуем всем пользователям, работающим с предыдущими версиями XenForo 2.2, обновиться до данной версии, чтобы повысить стабильность и безопасность работы форума.

Примечание:
XenForo 2.3.1 и выше не затронуты этой проблемой. Если Вы все еще используете XenForo 2.3.0, Вам следует обновиться до последней версии или применить патч, приведенный ниже.


Проблема связана с потенциальным эксплойтом перенаправления с использованием специально созданного URL.

XenForo выражает благодарность , . и команде за то, что они сообщили нам об этой проблеме.

Мы рекомендуем выполнить полное обновление для устранения проблем, но патч можно применить вручную. Более подробная информация приведена ниже.

Применение патча вручную:

Способ 1: ручное редактирование файла

Применение исправления в данном случае требует изменения одной функции в конкретном файле. Для этого найдите файл src/XF/App.php и найдите начало этой конкретной функции:

PHP:
    public function getDynamicRedirect($fallbackUrl = null, $useReferrer = true)

Найдите конец функции, который сейчас выглядит следующим образом:

PHP:
        return $fallbackUrl;
    }

Удалите весь этот блок кода и замените его следующим:

PHP:
    public function getDynamicRedirect($fallbackUrl = null, $useReferrer = true)
    {
        if ($fallbackUrl === null)
        {
            $fallbackUrl = $this->router()->buildLink('index');
        }

        $request = $this->request();
        $fallbackUrl = $request->convertToAbsoluteUri($fallbackUrl);

        $redirect = $request->filter('_xfRedirect', 'str');
        if (!$redirect && $useReferrer)
        {
            $redirect = $request->getServer('HTTP_X_AJAX_REFERER')
                ?: $request->getReferrer();
        }

        if (!$redirect || !preg_match('/./su', $redirect))
        {
            // no redirect provided
            return $fallbackUrl;
        }

        if (
            strpos($redirect, "\n") !== false ||
            strpos($redirect, "\r") !== false ||
            strpos($redirect, '@') !== false
        )
        {
            // redirect contained newlines or user/pass
            return $fallbackUrl;
        }

        $fullRedirect = $request->convertToAbsoluteUri($redirect);
        $redirectParts = @parse_url($fullRedirect);
        $redirectHost = $redirectParts['host'] ?? null;
        if (!$redirectHost)
        {
            // no redirect host
            return $fallbackUrl;
        }

        $requestParts = @parse_url($request->getFullBasePath());
        $requestHost = $requestParts['host'] ?? null;
        if ($redirectHost !== $requestHost)
        {
            // redirect host did not match request host
            return $fallbackUrl;
        }

        return $fullRedirect;
    }

Способ 2: применение патча/диффа
Для автоматического исправления файла можно применить следующее исправление:

Diff:
Index: src/XF/App.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/XF/App.php b/src/XF/App.php
--- a/src/XF/App.php    (revision 7f4538e8ad4a572dcff3e0416b56906ec84a53eb)
+++ b/src/XF/App.php    (revision 5a8b3ebd97eae9bc82d4f6aac5f17012d27b0043)
@@ -2305,50 +2305,85 @@
         return '__' . $hash;
     }
 
+    /**
+     * @param string|null $fallbackUrl
+     * @param bool $useReferrer
+     *
+     * @return string
+     */
     public function getDynamicRedirect($fallbackUrl = null, $useReferrer = true)
     {
+        if ($fallbackUrl === null)
+        {
+            $fallbackUrl = $this->router()->buildLink('index');
+        }
+
         $request = $this->request();
+        $fallbackUrl = $request->convertToAbsoluteUri($fallbackUrl);
 
         $redirect = $request->filter('_xfRedirect', 'str');
         if (!$redirect && $useReferrer)
         {
-            $redirect = $request->getServer('HTTP_X_AJAX_REFERER');
-            if (!$redirect)
-            {
-                $redirect = $request->getReferrer();
-            }
+            $redirect = $request->getServer('HTTP_X_AJAX_REFERER')
+                ?: $request->getReferrer();
+        }
+
+        if (!$redirect || !preg_match('/./su', $redirect))
+        {
+            // no redirect provided
+            return $fallbackUrl;
         }
 
-        if ($redirect && preg_match('/./su', $redirect))
+        if (
+            strpos($redirect, "\n") !== false ||
+            strpos($redirect, "\r") !== false ||
+            strpos($redirect, '@') !== false
+        )
         {
-            if (strpos($redirect, "\n") === false && strpos($redirect, "\r") === false)
-            {
-                $fullBasePath = $request->getFullBasePath();
+            // redirect contained newlines or user/pass
+            return $fallbackUrl;
+        }
 
-                $fullRedirect = $request->convertToAbsoluteUri($redirect);
-                $redirectParts = @parse_url($fullRedirect);
-                if ($redirectParts && !empty($redirectParts['host']))
-                {
-                    $pageParts = @parse_url($fullBasePath);
+        $fullRedirect = $request->convertToAbsoluteUri($redirect);
+        $redirectParts = @parse_url($fullRedirect);
+        $redirectHost = $redirectParts['host'] ?? null;
+        if (!$redirectHost)
+        {
+            // no redirect host
+            return $fallbackUrl;
+        }
 
-                    if ($pageParts && !empty($pageParts['host']) && $pageParts['host'] == $redirectParts['host'])
-                    {
-                        return $fullRedirect;
-                    }
-                }
-            }
-        }
+        $requestParts = @parse_url($request->getFullBasePath());
+        $requestHost = $requestParts['host'] ?? null;
+        if ($redirectHost !== $requestHost)
+        {
+            // redirect host did not match request host
+            return $fallbackUrl;
+        }
+
+        return $fullRedirect;
+    }
 
-        if ($fallbackUrl === null)
+    /**
+     * @param string $notUrl
+     * @param string|null $fallbackUrl
+     * @param bool $useReferrer
+     *
+     * @return string
+     */
+    public function getDynamicRedirectIfNot(
+        $notUrl,
+        $fallbackUrl = null,
+        $useReferrer = true
+    )
+    {
+        if ($fallbackUrl === false)
         {
             $fallbackUrl = $this->router()->buildLink('index');
         }
-        return $fallbackUrl;
-    }
 
-    public function getDynamicRedirectIfNot($notUrl, $fallbackUrl = null, $useReferrer = true)
-    {
         $request = $this->request();
+        $fallbackUrl = $request->convertToAbsoluteUri($fallbackUrl);
 
         $redirect = $this->getDynamicRedirect($fallbackUrl, $useReferrer);
         $notUrl = $request->convertToAbsoluteUri($notUrl);
@@ -2356,17 +2391,10 @@
         if (strpos($redirect, $notUrl) === 0)
         {
             // the URL we can't redirect to is at the start
-            if ($fallbackUrl === false)
-            {
-                $fallbackUrl = $this->router()->buildLink('index');
-            }
+            return $fallbackUrl;
+        }
 
-            return $request->convertToAbsoluteUri($fallbackUrl);
-        }
-        else
-        {
-            return $redirect;
-        }
+        return $redirect;
     }
 
     public function applyExternalDataUrl($externalPath, $canonical = false)

Примечание: Если вы решите исправить файлы вместо полного обновления, "Проверка работоспособности файлов" сообщит, что этот файл имеет "Неожиданное содержимое". Поскольку эти файлы больше не содержат того же содержимого, с которым поставлялась ваша версия XF, это вполне ожидаемо и может быть проигнорировано.

Как всегда, новые версии XenForo бесплатны для скачивания для всех клиентов с активными лицензиями, которые теперь могут загрузить новую версию из клиентской зоны или обновить ее из вашей панели управления администратора (Инструменты > Проверить наличие обновлений...).

Текущие системные требования

Минимальные системные требования:
  • PHP 7.0 или новее (мы рекомендуем PHP 8.2)
  • MySQL 5.5 и новее (так же совместимо с MariaDB/Percona и т.д. )
  • Все официальные плагины требуют для своей работы XenForo 2.2
  • Enhanced Search требует последнюю версию Elasticsearch 2.0.

Скачать скрипт проверки совместимости Вашего хостинга/сервера для корректной работы XenForo 2.2.
Автор
XFI Bot
Скачивания
9
Просмотры
120
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя XFI Bot

  • [XFA] RM Marketplace (shop) - XF2
    [XFA] RM Marketplace (shop) - XF2
    Возможность продажи ресурсов.
  • Happy Birthday Emails
    Happy Birthday Emails
    Отпразднуйте дни рождения ваших пользователей дружеским электронным письмом
  • s9e Media Sites
    s9e Media Sites
    Дополнительные медиа-сервисы для XenForo 2.

Поделиться ресурсом

Назад
Сверху Снизу