1. PHP / Говнокод #10346

    +74

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    # Определение IP адреса
    	static public function ip() {
    		
    		# Список возможных заголовков для получения ip адреса
    		$Sip 					= array();
    		$Sip['REMOTE_ADDR'] 			= getenv('REMOTE_ADDR');
    		$Sip['HTTP_FORWARDED_FOR'] 		= getenv('HTTP_FORWARDED_FOR');
    		$Sip['HTTP_X_FORWARDED_FOR'] 	= getenv('HTTP_X_FORWARDED_FOR');
    		$Sip['HTTP_X_COMING_FROM'] 	= getenv('HTTP_X_COMING_FROM');
    		$Sip['HTTP_VIA'] 			= getenv('HTTP_VIA');
    		$Sip['HTTP_XROXY_CONNECTION'] 	= getenv('HTTP_XROXY_CONNECTION');
    		$Sip['HTTP_CLIENT_IP'] 			= getenv('HTTP_CLIENT_IP');
    		$Sip['Unknow'] 				= '0.0.0.0';
    		
    		# Выбор найденного ip адреса
    		if(isset($Sip['REMOTE_ADDR'])) {
    			$Rip = $Sip['REMOTE_ADDR'];
    		} else if(isset($Sip['HTTP_FORWARDED_FOR'])) {
    			$Rip = $Sip['HTTP_FORWARDED_FOR'];
    		} else if(isset($Sip['HTTP_X_FORWARDED_FOR'])) {
    			$Rip = $Sip['HTTP_X_FORWARDED_FOR'];
    		} else if(isset($Sip['HTTP_X_COMING_FROM'])) {
    			$Rip = $Sip['HTTP_X_COMING_FROM'];
    		} else if(isset($Sip['HTTP_VIA'])) {
    			$Rip = $Sip['HTTP_VIA'];
    		} else if(isset($Sip['HTTP_XROXY_CONNECTION'])) {
    			$Rip = $Sip['HTTP_XROXY_CONNECTION'];
    		} else if(isset($Sip['HTTP_CLIENT_IP'])) {
    			$Rip = $Sip['HTTP_CLIENT_IP'];
    		} else {
    			$Rip = '0.0.0.0';
    		}
    		
    		# Валидация ip адреса
    		# Получение из секций массив
    		$ARip = explode( '.', $Rip );
    		
    		# Пересборка ip адреса
    		$RARip = array(0 => NULL, 1 => NULL, 2 => NULL, 3 => NULL);
    		for($n = 0; $n < 10; $n++) {
    			$RARip[0] .= isset( $ARip[0]{$n} ) ? $ARip[0]{$n} : NULL;
    			$RARip[1] .= isset( $ARip[1]{$n} ) ? $ARip[1]{$n} : NULL;
    			$RARip[2] .= isset( $ARip[2]{$n} ) ? $ARip[2]{$n} : NULL;
    			$RARip[3] .= isset( $ARip[3]{$n} ) ? $ARip[3]{$n} : NULL;
    		}
    		$BRip = substr( (int) $RARip[0], 0, 3 ) . '.' . substr( (int) $RARip[1], 0, 3 ) . '.' . substr( (int) $RARip[2], 0, 3 ) . '.' . substr( (int) $RARip[3], 0, 3 );
    		
    		# Возвращение пересобранного ip адреса
    		return $BRip;
    	}

    Не столько — «Г», сколько — «Извращение»...
    Улыбнуло имя переменной — $Rip;
    А раньше этот код был суровее — exit( $string ); в случаи не соответствия...

    Запостил: nethak, 22 Мая 2012

    Комментарии (21) RSS

    • > $RARip = array(0 => NULL , 1 => NULL , 2 => NULL, 3 => NULL );
      порадовало

      да, а как же $BDRip, $CamRip, $DVDRip?
      Ответить
      • http://tinyurl.com/pig-rar
        Ответить
      • array(0 => NULL , 1 => NULL , 2 => NULL, 3 => NULL ), если бы этой строки небыло, то конструкции ниже типа $RARip[0] вызвали бы ошибку типа NOTICE в режиме E_NOTICE, так что не совсем понятно что тут радует

        а если про RARip то да солидарен, ZIPip, GZip, BZip и т.п.)
        Ответить
    • ойпи.rarjpeg.txt
      Ответить
    • if(isset($Sip['REMOTE_ADDR'])) никогда не уйдет на else.
      Ответить
      • Вдруг у автора был такой случай, что у второй стороны не было адреса?
        Интересно, кстати, как этот код будет работать, если у клиента и сервера будут IPv6-адреса.
        Ответить
      • Были случаи, когда вся эта конструкция возвращала 0.0.0.0, разбирая на примере getenv('REMOTE_ADDR') — возврашало null...
        В Google chrome, причём именно и исключительно в нём, хоть казалось и нету связи с «кроссплатформенностью», не знаю с чем это связанно, и не пытался выяснить.
        Но сей факт, остаётся фактом.
        Ответить
        • Послушайте. Если на некотором подмножестве инсталляций Apache/PHP гарантированно удастся хоть с любым клиентом вернуть пустой REMOTE_ADDR - это будет как минимум феноменально.
          На деле, прорекаю чью-то косорукость в настройке сервера, или какой-то хитрый баг в минорной версии PHP. Что, опять, не играет никакой роли.
          Ответить
          • Могу сказать лишь одно, это произошло локально, на установленном ПО XAMPP.
            Ради интереса провёл эксперимент:
            error_reporting( E_ALL );
            exit( (string) getenv('REMOTE_ADDR') );

            Во всех браузерах мне вернуло — 127.0.0.1
            В Google chrome — ::1

            Вот Вам и феномен...
            Адрес проекта XAMPP: http://www.apachefriends.org/

            К сожалению версию не помню...

            Как Вы это прокомментируете?
            Ответить
            • $_SERVER['REMOTE_ADDR'] — аналогично.
              phpinfo() — аналогично.
              PHP Version 5.3.8

              Вот мне даже интересно стало, каким образом, клиент сыграл такую разницу...
              Ответить
            • Даже больше скажу, phpinfo() информацию вывел по разному...
              Версия G.H. 19.0.1084.46 m
              Ответить
            • Нихрена себе.
              Еще один аргумент в пользу браузеров, а не сторонних программ.
              Ответить
            • IPv6 ::1 = IPv4 127.0.0.1
              Отключите IPv6 на своей машине, и хром тоже определится как 127.0.0.1. Он походу просто предпочитает IPv6.
              Ответить
            • К сожалению, джва дня я прослоупоучил. Но выше ответили правильно. Это вполне годный адрес.
              ..и мы снова возвращаемся к вопросу, как унылокод ОП будет вести себя на (недайбх) IPv6.
              Ответить
    • А. Н. Крылов - Пхпешник и ай-пи.
      Ответить

    Добавить комментарий