|
12 | 12 | $browse = erLhcoreClassCoBrowse::getBrowseInstanceByOnlineUser($ouser); |
13 | 13 | } else { |
14 | 14 | $chat = erLhcoreClassChat::getSession()->load('erLhcoreClassModelChat', $Params['user_parameters']['chat_id']); |
| 15 | + if (!erLhcoreClassChat::hasAccessToRead($chat)) { |
| 16 | + exit; |
| 17 | + } |
15 | 18 | $browse = erLhcoreClassCoBrowse::getBrowseInstance($chat); |
16 | 19 | } |
17 | 20 |
|
| 21 | +// Require a co-browse session URL to bind the fetch origin |
| 22 | +if (empty($browse->url)) { |
| 23 | + exit; |
| 24 | +} |
| 25 | + |
18 | 26 | $base = trim($_GET['base']); |
19 | 27 |
|
20 | 28 | if (!filter_var($base, FILTER_VALIDATE_URL)) { |
|
28 | 36 | exit; |
29 | 37 | } |
30 | 38 |
|
| 39 | +// Bind to the co-browse session origin |
| 40 | +$browseUrl = parse_url($browse->url); |
| 41 | +$browseOrigin = ($browseUrl['scheme'] ?? '') . '://' . ($browseUrl['host'] ?? '') . (isset($browseUrl['port']) ? ':' . $browseUrl['port'] : ''); |
| 42 | +$requestOrigin = $url['scheme'] . '://' . $url['host'] . (isset($url['port']) ? ':' . $url['port'] : ''); |
| 43 | +if ($browseOrigin !== $requestOrigin) { |
| 44 | + exit; |
| 45 | +} |
| 46 | + |
31 | 47 | // Some basic validation |
32 | 48 | if (isset($url['host']) && $url['host'] != '' && strpos($_GET['css'], erLhcoreClassSystem::getHost()) === false) { |
33 | 49 |
|
|
52 | 68 | exit; |
53 | 69 | } |
54 | 70 |
|
| 71 | + // CSS URL must belong to the co-browse session origin |
| 72 | + $cssOrigin = $urlCSS['scheme'] . '://' . $urlCSS['host'] . (isset($urlCSS['port']) ? ':' . $urlCSS['port'] : ''); |
| 73 | + if ($cssOrigin !== $browseOrigin) { |
| 74 | + exit; |
| 75 | + } |
| 76 | + |
55 | 77 | $urlCSSDownload = $_GET['css']; |
56 | 78 | } |
57 | 79 |
|
| 80 | + // Resolve host and reject private/loopback destinations |
| 81 | + $downloadHost = parse_url($urlCSSDownload, PHP_URL_HOST); |
| 82 | + if ($downloadHost === null || $downloadHost === '') { |
| 83 | + exit; |
| 84 | + } |
| 85 | + $resolvedIp = gethostbyname($downloadHost); |
| 86 | + if ($resolvedIp === $downloadHost || !filter_var($resolvedIp, FILTER_VALIDATE_IP)) { |
| 87 | + exit; |
| 88 | + } |
| 89 | + if (!filter_var($resolvedIp, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { |
| 90 | + exit; |
| 91 | + } |
| 92 | + |
58 | 93 | $ch = curl_init(); |
59 | 94 | curl_setopt($ch, CURLOPT_URL, $urlCSSDownload); |
60 | 95 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
|
0 commit comments