| 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: | |