XenForo, olası bir güvenlik açığını önlemek üzere XenForo 2.2.17 sürümünü yayınladı. Buna göre XenForo 2.2.x kullanan tüm müşterilerin sürümü 2.2.17'e yükseltmesi önerildi.
1. Yamayı manuel olarak uygulama
Bu durumda düzeltmeyi uygulamak, belirli bir dosya içindeki tek bir işlevi değiştirmeyi gerektirir. Bunu yapmak için src/XF/App.php dosyasını bulun ve bu belirli işlevin başlangıcını belirleyin:
PHP:
public function getDynamicRedirect($fallbackUrl = null, $useReferrer = true)
Aşağıdaki fonksiyonu bulun:
PHP:
return $fallbackUrl;
}
Aşağıdaki kod ile değiştirin:
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. Yamayı otomatik olarak uygulama
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)