"PHP" / Говнокод #25553 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 arts, (Updated )

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

  • }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, но это уже тонкие детали.
        Ответить
        • Не "не фильтровали", а не эскейпили.
          Ответить
          • Как уже сказал Воксельный, при необходимости использования X-Forwarded-For его нужно именно фильтровать: если в нём не «\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}» (или аналогичная регулярка для IPv6) — это гарантированно поддельный и ненужный заголовок. Ну и октеты проверить надо, конечно.
            Ответить
          • Да. Всё остальное — крайне ненадёжные методы, которые потенциально открывают кучу дыр.

            В принципе, логгировать X-Forwarded-For и ему подобные заголовки имеет смысл, но только для информационных целей — например, для ручного разбирательства в случае чего.
            Ответить
        • > неанонимными
          Кстати, а что такая прокся делает если ей пришёл запрос, в котором уже есть x-forwarded-for?
          Ответить
              • P.S. Получается, что если я выхожу через цепочку прокси-серверов (в составе не менее двух единиц), то админ такого сайта не сможет вычислить мой айпи?
                Ответить
                • Если не логгирует X-Forwarded-For в текстовой форме — нет, не сможет. Но куда легче просто награбить и начекать анонимных проксей, их как грязи.
                  Ответить
                • Потому что в «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 с номером телефона.
          Ответить
    • Этому говну учат фреймворки. Вот код из 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,
                  );
              }
          Ответить
          • >>>
            '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.

    ЗЫ. Найди какую-нибудь книжку, и учи язык нормально, а не копипасть код откуда попало, тогда и вопросов меньше будет.
    Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8