1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: |
|
11: |
|
12: | namespace Xmf;
|
13: |
|
14: | |
15: | |
16: | |
17: | |
18: | |
19: | |
20: | |
21: | |
22: |
|
23: | class ProxyCheck
|
24: | {
|
25: | const PROXY_ENVIRONMENT_VARIABLE = 'proxy_env';
|
26: |
|
27: | const FORWARDED = 'HTTP_FORWARDED';
|
28: |
|
29: |
|
30: | protected $proxyHeaderName = false;
|
31: |
|
32: |
|
33: | protected $proxyHeader = false;
|
34: |
|
35: | |
36: | |
37: |
|
38: | public function __construct()
|
39: | {
|
40: |
|
41: | $this->proxyHeaderName = $this->getProxyEnvConfig();
|
42: | $this->proxyHeader = $this->getProxyHeader();
|
43: | }
|
44: |
|
45: | |
46: | |
47: | |
48: | |
49: | |
50: | |
51: | |
52: |
|
53: | public function get()
|
54: | {
|
55: | if (false===$this->proxyHeaderName || false===$this->proxyHeader) {
|
56: | return false;
|
57: | }
|
58: | $proxyVars = $this->splitOnComma($this->proxyHeader);
|
59: |
|
60: | $header = reset($proxyVars);
|
61: | $ip = false;
|
62: | switch ($this->proxyHeaderName) {
|
63: | case static::FORWARDED:
|
64: | $ip = $this->getFor($header);
|
65: | break;
|
66: | default:
|
67: | $ip = $this->getXForwardedFor($header);
|
68: | break;
|
69: | }
|
70: |
|
71: | return $ip;
|
72: | }
|
73: |
|
74: | |
75: | |
76: | |
77: | |
78: | |
79: | |
80: |
|
81: | protected function splitOnComma($header)
|
82: | {
|
83: | $parts = explode(',', $header);
|
84: | return array_map('trim', $parts);
|
85: | }
|
86: |
|
87: | |
88: | |
89: | |
90: | |
91: |
|
92: | protected function getProxyEnvConfig()
|
93: | {
|
94: | global $xoopsConfig;
|
95: |
|
96: |
|
97: | if (!isset($xoopsConfig[static::PROXY_ENVIRONMENT_VARIABLE])
|
98: | || empty($xoopsConfig[static::PROXY_ENVIRONMENT_VARIABLE])) {
|
99: | return false;
|
100: | }
|
101: | return trim($xoopsConfig[static::PROXY_ENVIRONMENT_VARIABLE]);
|
102: | }
|
103: |
|
104: | |
105: | |
106: | |
107: | |
108: |
|
109: | protected function getProxyHeader()
|
110: | {
|
111: | if (false === $this->proxyHeaderName || empty($_SERVER[$this->proxyHeaderName])) {
|
112: | return false;
|
113: | }
|
114: |
|
115: |
|
116: | return (string)$_SERVER[$this->proxyHeaderName];
|
117: | }
|
118: |
|
119: | |
120: | |
121: | |
122: | |
123: | |
124: | |
125: |
|
126: | protected function getFor($header)
|
127: | {
|
128: | $start = strpos($header, 'for=');
|
129: | if ($start === false) {
|
130: | return false;
|
131: | }
|
132: | $ip = substr($header, $start+4);
|
133: | $end = strpos($ip, ';');
|
134: | if ($end !== false) {
|
135: | $ip = substr($ip, 0, $end);
|
136: | }
|
137: | $ip = trim($ip, '"[] ');
|
138: |
|
139: | return $this->validateRoutableIP($ip);
|
140: | }
|
141: |
|
142: | |
143: | |
144: | |
145: | |
146: | |
147: | |
148: |
|
149: | protected function getXForwardedFor($ip)
|
150: | {
|
151: | return $this->validateRoutableIP($ip);
|
152: | }
|
153: |
|
154: | |
155: | |
156: | |
157: | |
158: | |
159: | |
160: |
|
161: | protected function validateRoutableIP($ip)
|
162: | {
|
163: | if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
|
164: | return false;
|
165: | }
|
166: | return $ip;
|
167: | }
|
168: | }
|
169: | |