1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
redirect.php
См. документацию.
1<?
3
6
8{
9 public static function BeforeLocalRedirect(&$url, $skip_security_check)
10 {
11 // ToDo: refactoring candidate
12
13 //This define will be used on buffer end handler
14 if (!defined("BX_SECURITY_LOCAL_REDIRECT"))
15 {
16 define("BX_SECURITY_LOCAL_REDIRECT", true);
17 }
18
20 if ($kernelSession->isStarted() && $kernelSession->has("LOCAL_REDIRECTS"))
21 {
22 if ($kernelSession["LOCAL_REDIRECTS"]["C"] == 0 && $kernelSession["LOCAL_REDIRECTS"]["R"] == '')
23 {
24 $kernelSession["LOCAL_REDIRECTS"]["R"] = ($_SERVER["HTTP_REFERER"] ?? '');
25 }
26 $kernelSession["LOCAL_REDIRECTS"]["C"]++;
27 }
28 else
29 {
30 $kernelSession["LOCAL_REDIRECTS"] = array("C" => 1, "R" => ($_SERVER["HTTP_REFERER"] ?? ''));
31 }
32
33 if ($skip_security_check)
34 {
35 return;
36 }
37
39 global $APPLICATION;
40
41 $good = true;
42 $url = str_replace("\xe2\x80\xae", "", $url);
43 $url_l = str_replace(array("\r", "\n"), "", $url);
44
45 //In case of absolute url will check if server to be redirected is our
46 $bSkipCheck = false;
47 if (preg_match('~^(?:http|https)://~iD', $url_l))
48 {
49 $uri = new \Bitrix\Main\Web\Uri($url_l);
50 $destinationHost = $uri->getHost();
51
52 if (defined("BX24_HOST_NAME"))
53 {
54 $arSite = array(
55 "SERVER_NAME" => BX24_HOST_NAME,
56 "DOMAINS" => ""
57 );
58 }
59 elseif (defined("SITE_ID"))
60 {
61 $rsSite = CSite::GetByID(SITE_ID);
62 $arSite = $rsSite->Fetch();
63 }
64 else
65 {
66 $arSite = false;
67 }
68
69 if (!$bSkipCheck && $arSite && $arSite["SERVER_NAME"])
70 {
71 $bSkipCheck = $destinationHost === $arSite["SERVER_NAME"];
72 }
73
74 if (!$bSkipCheck && $arSite && $arSite["DOMAINS"])
75 {
76 $arDomains = explode("\n", str_replace("\r", "\n", $arSite["DOMAINS"]));
77 foreach($arDomains as $domain)
78 {
79 $domain = trim($domain, " \t\n\r");
80 if ($domain <> '')
81 {
82 if ($domain === mb_substr($destinationHost, -mb_strlen($domain)))
83 {
84 $bSkipCheck = true;
85 break;
86 }
87 }
88 }
89 }
90
91 if (!$bSkipCheck)
92 {
93 $host = COption::GetOptionString("main", "server_name", "");
94 $bSkipCheck = $host && $destinationHost === $host;
95 }
96
97 if (stripos($destinationHost, '%2f') !== false)
98 {
99 $good = false;
100 $bSkipCheck = false;
101 }
102 }
103
104 if (!$bSkipCheck && preg_match("/^(http|https|ftp):\\/\\//i", $url_l))
105 {
106 if ($kernelSession["LOCAL_REDIRECTS"]["C"] > 1)
107 {
108 $REFERER_TO_CHECK = $kernelSession["LOCAL_REDIRECTS"]["R"];
109 }
110 else
111 {
112 $REFERER_TO_CHECK = ($_SERVER["HTTP_REFERER"] ?? '');
113 }
114
115 if ($good && COption::GetOptionString("security", "redirect_referer_check") == "Y")
116 {
117 $good &= $REFERER_TO_CHECK <> '';
118 }
119
120 if ($good && $REFERER_TO_CHECK <> '' && COption::GetOptionString("security", "redirect_referer_site_check") == "Y")
121 {
122 $valid_site = ($APPLICATION->IsHTTPS()? "https://": "http://").$_SERVER['HTTP_HOST']."/";
123 $good &= mb_strpos($REFERER_TO_CHECK, $valid_site) === 0;
124 }
125
126 if ($good && COption::GetOptionString("security", "redirect_href_sign") == "Y")
127 {
128 $sid = static::GetSeed();
129 $good &= static::Sign($sid, $url) === $_GET["af"];
130 }
131
132 $host = (new \Bitrix\Main\Web\Uri($url))->getHost();
133
134 if (!$good || ($host != '' && $host != $_SERVER['HTTP_HOST'])){
135 \Bitrix\Main\Application::getInstance()->getKernelSession()["LOCAL_REDIRECTS"] = [
136 "C" => 0,
137 "R" => ''
138 ];
139 }
140
141 if (!$good)
142 {
143 global $APPLICATION;
144
145 if (COption::GetOptionString("security", "redirect_log") == "Y")
146 {
148 "SECURITY",
149 "SECURITY_REDIRECT",
150 $APPLICATION->GetCurPage(),
151 $url
152 );
153 }
154
155 if (COption::GetOptionString("security", "redirect_action") == "show_message_and_stay")
156 {
157 $mess = COption::GetOptionString("security", "redirect_message_warning_".LANGUAGE_ID);
158 if ($mess == '')
159 {
160 $mess = COption::GetOptionString("security", "redirect_message_warning");
161 }
162
163 $charset = COption::GetOptionString("security", "redirect_message_charset");
164 if ($mess == '')
165 {
167 $charset = LANG_CHARSET;
168 }
169 $html_mess = str_replace("+", "&#43;", htmlspecialcharsbx($mess));
170
171 $url_c = $url;
172
173 if (preg_match('~^(http|https)(://)(.*?)(?:\\\\|/|\?|#|$)~iD', $url_c, $arMatch))
174 {
175 $converter = CBXPunycode::GetConverter();
176 $converted = $converter->Encode($arMatch[3]);
177 $converted = $converted ? $converted : $arMatch[3];
178 $url_e = $arMatch[1].$arMatch[2]. $converted .mb_substr($url_c, mb_strlen($arMatch[1].$arMatch[2].$arMatch[3]));
179 }
180 else
181 {
182 $url_e = $url;
183 }
184
186 $html_url = '<nobr><a href="'.htmlspecialcharsbx($url_e).'">'.htmlspecialcharsEx($url_c).'</a></nobr>';
187 $html_mess = str_replace("#URL#", $html_url, $html_mess);
188 CHTTP::SetStatus("404 Not Found");
189 header('X-Frame-Options: DENY');
190 header('X-Robots-Tag: noindex, nofollow');
191 ?>
192<html>
193<head>
194<meta http-equiv="Content-Type" content="text/html; charset=<?echo $charset?>" />
195<meta name="robots" content="noindex, nofollow" />
196<link rel="stylesheet" type="text/css" href="/bitrix/themes/.default/adminstyles.css" />
197<link rel="stylesheet" type="text/css" href="/bitrix/themes/.default/404.css" />
198</head>
199<body>
200
201<div class="error-404">
202<table class="error-404" border="0" cellpadding="0" cellspacing="0" align="center">
203 <tbody><tr class="top">
204 <td class="left"><div class="empty"></div></td>
205 <td><div class="empty"></div></td>
206 <td class="right"><div class="empty"></div></td>
207 </tr>
208 <tr>
209 <td class="left"><div class="empty"></div></td>
210 <td class="content">
211 <div class="description">
212 <table cellpadding="0" cellspacing="0">
213 <tbody><tr>
214 <td><div class="icon"></div></td>
215 <td><?=$html_mess?></td>
216 </tr>
217 </tbody></table>
218 </div>
219 </td>
220 <td class="right"><div class="empty"></div></td>
221 </tr>
222 <tr class="bottom">
223 <td class="left"><div class="empty"></div></td>
224 <td><div class="empty"></div></td>
225 <td class="right"><div class="empty"></div></td>
226 </tr>
227</tbody></table>
228</div>
229</body>
230</html>
231 <?
232 die();
233 }
234 else
235 {
236 $url = COption::GetOptionString("security", "redirect_url");
237 }
238 }
239 }
240 }
241
242 public static function GetDefaultMessage($language_id = false)
243 {
244 if ($language_id===false)
245 {
246 return GetMessage("SEC_REDIRECT_DEFAULT_MESSAGE");
247 }
248 else
249 {
250 $mess = IncludeModuleLangFile(__FILE__, $language_id, true);
251 if ($mess["SEC_REDIRECT_DEFAULT_MESSAGE"] <> '')
252 {
253 return $mess["SEC_REDIRECT_DEFAULT_MESSAGE"];
254 }
255 else
256 {
257 return GetMessage("SEC_REDIRECT_DEFAULT_MESSAGE");
258 }
259 }
260 }
261
262 public static function EndBufferContent(&$content)
263 {
264 //There was no looped local redirects
265 //so it's only true referer
266 if (!defined("BX_SECURITY_LOCAL_REDIRECT"))
267 {
268 \Bitrix\Main\Application::getInstance()->getKernelSession()["LOCAL_REDIRECTS"] = [
269 "C" => 0,
270 "R" => ($_SERVER["HTTP_REFERER"] ?? '')
271 ];
272 }
273
274 if (COption::GetOptionString("security", "redirect_href_sign") == "Y")
275 {
276 $content = preg_replace_callback("#(<a\\s[^>/]*?href\\s*=\\s*)(['\"])(.+?)(\\2)#i", '\CSecurityRedirect::ReplaceHREF',
277 $content);
278 }
279 }
280
281 protected static function ReplaceHREF($matches)
282 {
283 static $arUrls = false;
284 static $sid = false;
285 static $strDomains = false;
286
287 if (!$arUrls)
288 {
289 $arUrls = self::GetUrls();
290 $sid = static::GetSeed();
291 $arDomains = self::GetDomains();
292 foreach($arDomains as $i => $domain)
293 {
294 $arDomains[$i] = preg_quote($domain, "/");
295 }
296 $strDomains = "/.*(".implode("|", $arDomains).")$/";
297 }
298
299 foreach($arUrls as $arUrl)
300 {
301 if (preg_match("/^(http(?:s){0,1}\\:\\/\\/(?:[a-zA-Z0-9\\.-])+){0,1}".preg_quote($arUrl["URL"], "/")."?.*?".preg_quote($arUrl["PARAMETER_NAME"], "/")."=(http|https|ftp)(:|%3A|&#37;3A)(\\/\\/|%2F%2F|&#37;2F&#37;2F)([^&]+)/im", $matches[3], $match))
302 {
303 if ($match[1] == '' || preg_match($strDomains, $match[1]))
304 {
305 $goto = $match[2].$match[3].$match[4].$match[5];
306 $goto = str_replace(
307 array("&#37;", "%3A", "%2F"),
308 array("%", ":", "/"),
309 $goto);
310
311 return $matches[1].$matches[2].$matches[3]."&amp;af=".static::Sign($sid, urldecode($goto)).$matches[4];
312 }
313 }
314 }
315 return $matches[0];
316 }
317
318 public static function GetUrls()
319 {
323 global $CACHE_MANAGER;
324 if (CACHED_b_sec_redirect_url !== false)
325 {
326 $cache_id = "b_sec_redirect_url";
327 if ($CACHE_MANAGER->Read(CACHED_b_sec_filter_mask, $cache_id, "b_sec_redirect_url"))
328 {
329 $arUrls = $CACHE_MANAGER->Get($cache_id);
330 }
331 else
332 {
333 $arUrls = array();
334 $rs = RedirectRuleTable::getList([
335 "select" => ["URL", "PARAMETER_NAME", "IS_SYSTEM"],
336 "order" => ["IS_SYSTEM" => "DESC", "SORT" => "ASC"]]
337 );
338
339 while($ar = $rs->Fetch())
340 {
341 $arUrls[] = $ar;
342 }
343 $CACHE_MANAGER->Set($cache_id, $arUrls);
344 }
345 }
346 else
347 {
348 $arUrls = array();
349 $rs = RedirectRuleTable::getList([
350 "select" => ["URL", "PARAMETER_NAME", "IS_SYSTEM"],
351 "order" => ["IS_SYSTEM" => "DESC", "SORT" => "ASC"]]
352 );
353
354 while($ar = $rs->Fetch())
355 {
356 $arUrls[] = $ar;
357 }
358 }
359 return $arUrls;
360 }
361
362 public static function GetDomains()
363 {
364 $rs = SiteDomainTable::getList([
365 'select' => ['DOMAIN'],
366 'cache' => ['ttl' => 86400],
367 ]);
368
369 $arDomains = [];
370 while ($ar = $rs->fetch())
371 {
372 $arDomains[] = $ar['DOMAIN'];
373 }
374
375 return $arDomains;
376 }
377
378 public static function ReSeed()
379 {
380 COption::SetOptionString("security", "redirect_sid", Bitrix\Main\Security\Random::getString(32));
381 }
382
383 public static function GetSeed()
384 {
385 $seed = COption::GetOptionString("security", "redirect_sid");
386 if (!$seed)
387 {
388 static::ReSeed();
389 $seed = COption::GetOptionString("security", "redirect_sid");
390 }
391 return $seed;
392 }
393
394 public static function Sign($seed, $data)
395 {
396 $seed .= $_SERVER["REMOTE_ADDR"];
397 return md5($seed.md5($seed.":".$data));
398 }
399
400 public static function IsActive()
401 {
402 $bActive = false;
403 foreach(GetModuleEvents("main", "OnBeforeLocalRedirect", true) as $event)
404 {
405 if ($event["TO_MODULE_ID"] == "security" && $event["TO_CLASS"] == "CSecurityRedirect")
406 {
407 $bActive = true;
408 break;
409 }
410 }
411 return $bActive;
412 }
413
414 public static function SetActive($bActive = false)
415 {
416 if ($bActive)
417 {
419 {
420 static::ReSeed();
421 RegisterModuleDependences("main", "OnBeforeLocalRedirect", "security", "CSecurityRedirect", "BeforeLocalRedirect", "1");
422 RegisterModuleDependences("main", "OnEndBufferContent", "security", "CSecurityRedirect", "EndBufferContent", "1");
423 }
424 }
425 else
426 {
428 {
429 UnRegisterModuleDependences("main", "OnBeforeLocalRedirect", "security", "CSecurityRedirect", "BeforeLocalRedirect");
430 UnRegisterModuleDependences("main", "OnEndBufferContent", "security", "CSecurityRedirect", "EndBufferContent");
431 }
432 }
433 }
434
435 public static function Update($arUrls)
436 {
440 global $CACHE_MANAGER;
441
442 if (is_array($arUrls))
443 {
444
445 $res = RedirectRuleTable::deleteList(["!=IS_SYSTEM" => "Y"]);
446
447 if ($res)
448 {
449 $added = array();
450 $i = 10;
451 foreach($arUrls as $arUrl)
452 {
453 $url = trim($arUrl["URL"]);
454 $param = trim($arUrl["PARAMETER_NAME"]);
455 $key = $url.":".$param;
456
457 if (mb_strlen($url) && mb_strlen($param) && !array_key_exists($key, $added))
458 {
459 $arUrl = array(
460 "ID" => 1,
461 "IS_SYSTEM" => "N",
462 "SORT" => $i,
463 "URL" => $url,
464 "PARAMETER_NAME" => $param,
465 );
466
467 RedirectRuleTable::add($arUrl);
468 $i += 10;
469 $added[$key] = true;
470 }
471 }
472
473 if (CACHED_b_sec_redirect_url !== false)
474 {
475 $CACHE_MANAGER->CleanDir("b_sec_redirect_url");
476 }
477 }
478 }
479
480 return true;
481 }
482
483 public static function GetList()
484 {
485 $res = RedirectRuleTable::getList([
486 "select" => ["URL", "PARAMETER_NAME", "IS_SYSTEM"],
487 "order" => ["IS_SYSTEM" => "DESC", "SORT" => "ASC"]]
488 );
489 return $res;
490 }
491
492}
493?>
global $APPLICATION
Определения include.php:80
static getInstance()
Определения application.php:98
static GetConverter()
Определения punycode.php:25
static SetStatus($status)
Определения http.php:476
static getInstance()
Определения event.php:41
Определения redirect.php:8
static Update($arUrls)
Определения redirect.php:435
static ReSeed()
Определения redirect.php:378
static Sign($seed, $data)
Определения redirect.php:394
static EndBufferContent(&$content)
Определения redirect.php:262
static IsActive()
Определения redirect.php:400
static GetList()
Определения redirect.php:483
static BeforeLocalRedirect(&$url, $skip_security_check)
Определения redirect.php:9
static GetUrls()
Определения redirect.php:318
static ReplaceHREF($matches)
Определения redirect.php:281
static GetSeed()
Определения redirect.php:383
static GetDomains()
Определения redirect.php:362
static GetDefaultMessage($language_id=false)
Определения redirect.php:242
static SetActive($bActive=false)
Определения redirect.php:414
global $CACHE_MANAGER
Определения clear_component_cache.php:7
$content
Определения commerceml.php:144
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
<? if( $useEditor3):?>< tr class="heading">< td colspan="2"><? echo GetMessage("FILEMAN_OPTION_SPELL_SET");?></td ></tr ><? if(function_exists( 'pspell_config_create')):$use_pspell_checked=(COption::GetOptionString( $module_id, "use_pspell", "Y")=="Y") ? "checked" :"";?>< tr >< td valign="top">< label for="use_pspell"><?echo GetMessage("FILEMAN_OPTION_USE_PSPELL");?></label >< br >< a title="<?echo GetMessage("FILEMAN_OPTION_ADDISH_DICS_TITLE");?> http
Определения options.php:1473
$res
Определения filter_act.php:7
$host
Определения .description.php:9
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
if(file_exists($_SERVER['DOCUMENT_ROOT'] . "/urlrewrite.php")) $uri
Определения urlrewrite.php:61
const LANG_CHARSET
Определения include.php:65
$kernelSession
Определения include.php:181
RegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $SORT=100, $TO_PATH="", $TO_METHOD_ARG=[])
Определения tools.php:5295
UnRegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $TO_PATH="", $TO_METHOD_ARG=[])
Определения tools.php:5289
htmlspecialcharsEx($str)
Определения tools.php:2685
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
if(empty($signedUserToken)) $key
Определения quickway.php:257
die
Определения quickway.php:367
$i
Определения factura.php:643
text align
Определения template.php:556
$matches
Определения index.php:22
const SITE_ID
Определения sonet_set_content_view.php:12
$rs
Определения action.php:82
$url
Определения iframe.php:7