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

    −1

    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
    <?php $connection = mysqli_connect ('localhost','root','','userlistdb'); 
           
    
    
    // Проверка, если это общий клиент
    if (!empty($_SERVER['HTTP_CLIENT_IP'])){
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    //Is it a proxy address
    }elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }else{
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    // Значение $ ip в этот момент будет выглядеть примерно так: "192.0.34.166"
    $ip = ip2long($ip);
    // Теперь $ ip будет выглядеть примерно так: 1073732954
    
    
    $sql = "INSERT INTO user(ip) VALUES('$ip')";
    $dbQuery = mysql_query($sql,$dbLink);
    
    
    
        $stmt = $dbh->prepare("INSERT INTO usertbl(ip) VALUES(ip)");
        $stmt->bindParam(1, $ip);
    
        $stmt->execute();
    ?>
    выдаёт ошибку:
    Примечание : Не определено переменная: DBLink в C: \ XAMPP \ HTDOCS \ офсетные \ testip.php на линии 21 
    
    Внимание : mysql_query () ожидает параметр 2 , чтобы быть ресурсом, приведены в нуль C: \ XAMPP \ HTDOCS \ кормили \ testip.php на строка 21 
    
    Примечание : неопределенная переменная: dbh в C: \ xampp \ htdocs \ fed \ testip.php в строке 25 
    
    Фатальная ошибка : вызов функции-члена prepare () для null в C: \ xampp \ htdocs \ fed \ testip.php на линии 25
    
    $dbQuery = mysql_query($sql,$dbLink);
    
    $stmt = $dbh->prepare("INSERT INTO usertbl(ip) VALUES(ip)");

    Кто знает как записать IP из формы и сохранить в базу даных MySQL

    Запостил: arts, 18 Апреля 2019

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

    • не использовать пидарскую базу для тупых неосиляторов а взять нормальую СУБД для профессионалов

      https://www.postgresql.org/docs/9.3/datatype-net-types.html
      Ответить
    • }elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
      }

      Скорее небо упадёт на Землю, чем переведутся дураки, которые так делают.
      Ответить
      • А что это?
        Ответить
        • Попытка определить «реальный» IP клиента. Дело в том, что некоторые прокси-серверы добавляют в запросы заголовок X-FORWARDED-FOR, в который помещают IP, с которого поступил запрос на прокси-сервер. Такие прокси называют «неанонимными».
          И всё было бы хорошо, если бы не один момент: любой клиент может спокойно добавить этот заголовок с абсолютно случайными данными. Более того, есть даже расширения, которые в автоматическом режиме на каждый запрос шлют случайный «реальный» IP. Поэтому доверять таким заголовкам (их несколько разных бывает, они не стандартизированы) абсолютно бессмысленно, а иногда и вредно (когда-то давно видел даже SQL-инъекцию, которая возникала из-за того, что анскиллябры не фильтровали содержимое заголовка). Но недалёкие желающие наебать систему и деанонимизировать злобных хакеров продолжают засыпать «SO» вопросами в стиле «How to get user's real IP».

          Разумеется, это не касается всяких хитрых конфигураций, когда, к примеру, сайт стоит за «Cloudflare», который гарантированно добавляет настоящий IP, но это уже тонкие детали.
          Ответить
          • Не "не фильтровали", а не эскейпили.
            Ответить
            • IP не имеет смысла эскейпить, если это не реальный IP, то он нахуй не нужен.
              Ответить
            • Как уже сказал Воксельный, при необходимости использования X-Forwarded-For его нужно именно фильтровать: если в нём не «\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}» (или аналогичная регулярка для IPv6) — это гарантированно поддельный и ненужный заголовок. Ну и октеты проверить надо, конечно.
              Ответить
          • Получается надежный способ - это $_SERVER['REMOTE_ADDR']?
            Ответить
            • Да. Всё остальное — крайне ненадёжные методы, которые потенциально открывают кучу дыр.

              В принципе, логгировать X-Forwarded-For и ему подобные заголовки имеет смысл, но только для информационных целей — например, для ручного разбирательства в случае чего.
              Ответить
          • > how to get user's real IP
            and to beat his ebalo.
            Ответить
          • > неанонимными
            Кстати, а что такая прокся делает если ей пришёл запрос, в котором уже есть x-forwarded-for?
            Ответить
            • Undefined behaviour.
              Ответить
            • Дописывает свой адрес туда через запятую.
              Ответить
              • А что в этом случае сделает функция ip2long?

                Ни за что не догадаетесь. Возвращает false:
                https://ideone.com/sMEM79
                Ответить
                • P.S. Получается, что если я выхожу через цепочку прокси-серверов (в составе не менее двух единиц), то админ такого сайта не сможет вычислить мой айпи?
                  Ответить
                  • Если не логгирует X-Forwarded-For в текстовой форме — нет, не сможет. Но куда легче просто награбить и начекать анонимных проксей, их как грязи.
                    Ответить
                • > Возвращает false:
                  Интересно, а почему не -42?..
                  Ответить
                  • Потому что в «PHP» модно в случае ошибки возвращать значение другого типа. Иначе зачем нам динамическая типизация?
                    Ответить
                    • Хм-м-м, верно. Тогда надо возвращать «"Invalid IP"»!
                      Ответить
                      • А чтобы быть совсем модным, нужно возвращать «JSON»:
                        "{'success': false, 'errorcode': -42, 'message': 'Invalid IP'}"
                        Ответить
                        • Это не "модным", это чтобы не рвать волосы на жопе когда надо будет расширяться. Зря ты это.
                          Ответить
            • Точно, я почему-то думал, что в X-Forwarded-For может только один IP быть, а цепочки — только в каких-то других. Но нет:
              The general format of the field is:
              X-Forwarded-For: client, proxy1, proxy2
              Ответить
          • Некоторые прокси добавляют заголовок Via или Forwarded, в который помещают не только IP-адрес, но ещё и какой-то текст. Поскольку формат бывает разный, использовать содержимое таких заголовков можно только «для ручного разбирательства в случае чего».

            А некоторые опсосы и некоторые мобильные браузеры добавляют заголовок X-MSISDN с номером телефона.
            Ответить
            • > Поскольку формат бывает разный, использовать содержимое таких заголовков можно только «для ручного разбирательства в случае чего».
              На "Forwarded" есть спецификация:
              https://tools.ietf.org/html/rfc7239#section-4
              и на "Via":
              https://tools.ietf.org/html/rfc7230#section-5.7.1
              в отличие от "X-Forwarded-For", на который нет спецификаций, и он стал стандартом де-факто:
              https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For

              Просто у них синтаксис сложнее.
              Ответить
      • Этому говну учат фреймворки. Вот код из Zend Framework (класс Zend_Controller_Request_Http):
        /**
             * Get the client's IP addres
             *
             * @param  boolean $checkProxy
             * @return string
             */
            public function getClientIp($checkProxy = true)
            {
                if ($checkProxy && $this->getServer('HTTP_CLIENT_IP') != null) {
                    $ip = $this->getServer('HTTP_CLIENT_IP');
                } else if ($checkProxy && $this->getServer('HTTP_X_FORWARDED_FOR') != null) {
                    $ip = $this->getServer('HTTP_X_FORWARDED_FOR');
                } else {
                    $ip = $this->getServer('REMOTE_ADDR');
                }
        
                return $ip;
            }
        Ответить
        • Какое говно )))
          Ответить
          • Причём по умолчанию $checkProxy = true. Если этот метод вызвать без параметров, то он вернёт содержимое заголовка X-Forwarded-For (если найдёт), причём фильтровать его не будет.
            Ответить
          • Кто сможет угадать, что в Symfony?

            Спойлерю ответ:
            /**
                 * Returns the client IP address.
                 *
                 * @param  Boolean $proxy Whether the current request has been made behind a proxy or not
                 *
                 * @return string The client IP address
                 *
                 * @api
                 */
                public function getClientIp($proxy = false)
                {
                    if ($proxy) {
                        if ($this->server->has('HTTP_CLIENT_IP')) {
                            return $this->server->get('HTTP_CLIENT_IP');
                        } elseif (self::$trustProxy && $this->server->has('HTTP_X_FORWARDED_FOR')) {
                            $clientIp = explode(',', $this->server->get('HTTP_X_FORWARDED_FOR'), 2);
            
                            return isset($clientIp[0]) ? trim($clientIp[0]) : '';
                        }
                    }
            
                    return $this->server->get('REMOTE_ADDR');
                }
            Ответить
          • Идём дальше. Кака CakePHP:
            /**
             * Get the IP the client is using, or says they are using.
             *
             * @param boolean $safe Use safe = false when you think the user might manipulate their HTTP_CLIENT_IP
             *   header.  Setting $safe = false will will also look at HTTP_X_FORWARDED_FOR
             * @return string The client IP.
             */
            	public function clientIp($safe = true) {
            		if (!$safe && env('HTTP_X_FORWARDED_FOR') != null) {
            			$ipaddr = preg_replace('/(?:,.*)/', '', env('HTTP_X_FORWARDED_FOR'));
            		} else {
            			if (env('HTTP_CLIENT_IP') != null) {
            				$ipaddr = env('HTTP_CLIENT_IP');
            			} else {
            				$ipaddr = env('REMOTE_ADDR');
            			}
            		}
            
            		if (env('HTTP_CLIENTADDRESS') != null) {
            			$tmpipaddr = env('HTTP_CLIENTADDRESS');
            
            			if (!empty($tmpipaddr)) {
            				$ipaddr = preg_replace('/(?:,.*)/', '', $tmpipaddr);
            			}
            		}
            		return trim($ipaddr);
            	}
            Ответить
          • MODX:
            /**
                 * Get the true client IP. Returns an array of values:
                 * 
                 * * ip - The real, true client IP
                 * * suspected - The suspected IP, if not alike to REMOTE_ADDR
                 * * network - The client's network IP
                 *
                 * @access public
                 * @return array
                 */
                public function getClientIp() {
                    $ip = '';
                    $ipAll = array(); // networks IP
                    $ipSus = array(); // suspected IP
            
                    $serverVariables = array(
                        'HTTP_X_FORWARDED_FOR',
                        'HTTP_X_FORWARDED',
                        'HTTP_X_CLUSTER_CLIENT_IP',
                        'HTTP_X_COMING_FROM',
                        'HTTP_FORWARDED_FOR',
                        'HTTP_FORWARDED',
                        'HTTP_COMING_FROM',
                        'HTTP_CLIENT_IP',
                        'HTTP_FROM',
                        'HTTP_VIA',
                        'REMOTE_ADDR',
                    );
            
                    foreach ($serverVariables as $serverVariable) {
                        $value = '';
                        if (isset($_SERVER[$serverVariable])) {
                            $value = $_SERVER[$serverVariable];
                        } elseif (getenv($serverVariable)) {
                            $value = getenv($serverVariable);
                        }
            
                        if (!empty($value)) {
                            $tmp = explode(',', $value);
                            $ipSus[] = $tmp[0];
                            $ipAll = array_merge($ipAll,$tmp);
                        }
                    }
            
                    $ipSus = array_unique($ipSus);
                    $ipAll = array_unique($ipAll);
                    $ip = (sizeof($ipSus) > 0) ? $ipSus[0] : $ip;
            
                    return array(
                        'ip' => $ip,
                        'suspected' => $ipSus,
                        'network' => $ipAll,
                    );
                }
            Ответить
            • > real, true client ip
              modx_real_get_client_ip
              Ответить
            • >>>
              'HTTP_X_FORWARDED_FOR',
                          'HTTP_X_FORWARDED',
                          'HTTP_X_CLUSTER_CLIENT_IP',
                          'HTTP_X_COMING_FROM',
                          'HTTP_FORWARDED_FOR',
                          'HTTP_FORWARDED',
                          'HTTP_COMING_FROM',
                          'HTTP_CLIENT_IP',
                          'HTTP_FROM',
                          'HTTP_VIA',


              Есть 14 конкурирующих стандартов.png
              Ответить
            • Была бы, кстати, самая адекватная реализация, если бы «'ip'» брался только из «REMOTE_ADDR». А так получилось такое же дерьмо.
              Ответить

            • Так может это gost напиздел, и это всё правильные способы? Не могут же столько фреймворков ошибаться.
              Ответить
          • Kohana (что в переводе с украинского означает «любимая»):
            if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])
            			    AND isset($_SERVER['REMOTE_ADDR'])
            			    AND in_array($_SERVER['REMOTE_ADDR'], Request::$trusted_proxies))
            			{
            				// Use the forwarded IP address, typically set when the
            				// client is using a proxy server.
            				// Format: "X-Forwarded-For: client1, proxy1, proxy2"
            				$client_ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            
            				Request::$client_ip = array_shift($client_ips);
            
            				unset($client_ips);
            			}
            			elseif (isset($_SERVER['HTTP_CLIENT_IP'])
            			        AND isset($_SERVER['REMOTE_ADDR'])
            			        AND in_array($_SERVER['REMOTE_ADDR'], Request::$trusted_proxies))
            			{
            				// Use the forwarded IP address, typically set when the
            				// client is using a proxy server.
            				$client_ips = explode(',', $_SERVER['HTTP_CLIENT_IP']);
            
            				Request::$client_ip = array_shift($client_ips);
            
            				unset($client_ips);
            			}
            			elseif (isset($_SERVER['REMOTE_ADDR']))
            			{
            				// The remote IP address
            				Request::$client_ip = $_SERVER['REMOTE_ADDR'];
            			}

            Весь код метода factory я цитировать не буду.
            Ответить
    • А почему у тебя mysql_query а сверху mysqli_connect?
      Поиграй с кавычками и пробелами) "INSERT INTO user (ip) VALUES('".$ip."')"
      Ответить
    • Какое месиво из копипаста )))
      Ответить
    • mysql_query хочет вторым параметром соединение, которое у тебя в $connection, а не в $dblink.

      Строки 24-27 у тебя лишние, ты не используешь PDO.

      ЗЫ. Найди какую-нибудь книжку, и учи язык нормально, а не копипасть код откуда попало, тогда и вопросов меньше будет.
      Ответить
      • StackOverflow-driven-development
        Ответить
      • по пхп нет норальных книжек
        Ответить
      • >> Строки 24-27 у тебя лишние, ты не используешь PDO.

        Подготовленные выражения есть не только в PDO:
        https://www.php.net/manual/ru/mysqli-stmt.prepare.php

        Но здесь и вправду эти строки лишние, потому что переменная $dbh не инициализирована.
        Ответить
    • https://sun1-15.userapi.com/c850528/v850528781/118d4b/Cfdk9tETEks.jpg

      Какой анскилл )))
      Ответить

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