무고한 IP 데이터베이스를 읽는 PHP의 간단한 예

WBOY
풀어 주다: 2016-07-25 08:54:40
원래의
1489명이 탐색했습니다.
  1. /*---------------------------- -------------
  2. ip2address [qqwry.dat]
  3. ------------ - -------------------------------------*/
  4. 클래스 IP {
  5. var $ fh ; //IP 데이터베이스 파일 핸들
  6. var $first; //첫번째 인덱스
  7. var $last; //마지막 인덱스
  8. var $total; //전체 인덱스
  9. 🎜> function __construct() {
  10. $this->fh = fopen('qqwry.dat', 'rb'); //qqwry.dat 파일
  11. $this->first = $this- > ;getLong4();
  12. $this->last = $this->getLong4();
  13. $this->total = ($this->last - $this->first) / 7; //각 인덱스는 7바이트입니다
  14. }
  15. //IP 유효성 확인
  16. function checkIp($ip) {
  17. $arr =explore('.',$ip)
  18. if(count($arr) !=4 ) {
  19. return false;
  20. } else {
  21. for ($i=0; $i < 4; $i ) {
  22. if ($ arr[$i] <'0' || $arr[$i] > '255') {
  23. false 반환;
  24. }
  25. }
  26. }
  27. true 반환;
  28. }
  29. function getLong4() {
  30. //리틀 엔디안 인코딩의 4바이트를 읽고 긴 정수로 변환합니다.
  31. $result = unpack('Vlong', fread( $this-> ;fh, 4));
  32. return $result['long'];
  33. }
  34. function getLong3() {
  35. //리틀 엔디안 인코딩의 3단어 읽기 섹션을 긴 정수로 변환
  36. $result = unpack('Vlong', fread($this->fh, 3).chr(0));
  37. return $result['long'];
  38. }
  39. // 정보 조회
  40. function getInfo($data = "") {
  41. $char = fread($this->fh, 1);
  42. while (ord($char ) != 0) { // 국가 및 지역 정보는 0으로 끝납니다
  43. $data .= $char;
  44. $char = fread($this->fh, 1);
  45. }
  46. return $data;
  47. } bbs.it-home.org
  48. //지역 정보 조회
  49. function getArea() {
  50. $byte = fread($this->fh, 1) // 플래그 바이트
  51. 스위치( ord($byte)) {
  52. 사례 0: $area = ''; break; //지역 정보 없음
  53. 사례 1: //지역이 리디렉션됨
  54. fseek ($this->fh, $ this->getLong3());
  55. $area = $this->getInfo(); break;
  56. 사례 2: //영역이 리디렉션됩니다
  57. fseek($this->fh, $ this->getLong3());
  58. $area = $this->getInfo(); break;
  59. 기본값: $area = $this->getInfo ($byte); 영역이 리디렉션되지 않습니다
  60. }
  61. return $area;
  62. }
  63. function ip2addr($ip) {
  64. if(!$this -> checkIp($ip)){
  65. return false;
  66. }
  67. $ip = pack('N', intval(ip2long($ip)));
  68. //이진 검색
  69. $ l = 0;
  70. $r = $this->total;
  71. while($l <= $r) {
  72. $m = Floor(($l $r) / 2) / /중간 지수 계산
  73. fseek($ this->fh, $this->first $m * 7);
  74. $beginip = strrev(fread($this->fh, 4)) ///중간 인덱스의 시작 IP 주소
  75. fseek($this->fh, $this->getLong3());
  76. $endip = strrev(fread($this->fh, 4)) //중간 인덱스의 IP 주소 끝
  77. if ($ip < $beginip) { //사용자의 IP가 중간 인덱스의 시작 IP 주소보다 작은 경우
  78. $r = $m - 1;
  79. } else {
  80. if ($ip > $endip) { //사용자의 IP가 중간 인덱스의 끝 IP 주소보다 큰 경우
  81. $l = $m 1;
  82. } else { //사용자의 IP는 중간 인덱스 IP 범위 내에 있는 경우
  83. $findip = $this->first $m * 7;
  84. break;
  85. }
  86. }
  87. }
  88. //국가 및 지역 쿼리 information
  89. fseek($this->fh, $findip);
  90. $location['beginip'] = long2ip($this->getLong4()); //사용자 IP 범위의 시작 주소
  91. $ offset = $this->getlong3();
  92. fseek($this->fh, $offset);
  93. $location['endip'] = long2ip($this->getLong4 ()); //사용자 IP 범위의 끝 주소
  94. $byte = fread($this->fh, 1) //플래그 바이트
  95. 스위치(ord($byte)) {
  96. 사례 1: //국가 및 지역 정보가 모두 리디렉션됩니다
  97. $countryOffset = $this->getLong3() //주소 리디렉션
  98. fseek($this->fh, $countryOffset);
  99. $ byte = fread($this->fh, 1); //플래그 바이트
  100. switch (ord($byte)) {
  101. 사례 2: //국가 정보가 두 번 리디렉션됩니다.
  102. fseek ($ this->fh, $this->getLong3());
  103. $location['country'] = $this->getInfo();
  104. fseek($this->fh, $countryOffset 4);
  105. $location['area'] = $this->getArea();
  106. break;
  107. 기본값: //국가 정보는 두 번 리디렉션되지 않습니다.
  108. $location ['국가' ] = $this->getInfo($byte);
  109. $location['area'] = $this->getArea();
  110. break;
  111. }
  112. break ;
  113. 사례 2: //국가 정보가 리디렉션됩니다
  114. fseek($this->fh, $this->getLong3());
  115. $location['country'] = $this- >getInfo() ;
  116. fseek($this->fh, $offset 8);
  117. $location['area'] = $this->getArea();
  118. break;
  119. 기본값: // 국가 정보는 리디렉션되지 않습니다
  120. $location['country'] = $this->getInfo($byte);
  121. $location['area'] = $this->getArea ();
  122. 휴식;
  123. }
  124. //gb2312를 utf-8로 (정보가 없을 때 표시되는 CZ88.NET 제거)
  125. foreach ($location as $k => $v) {
  126. $location[$k] = str_replace ( 'CZ88.NET','',iconv('gb2312', 'utf-8', $v));
  127. }
  128. return $location;
  129. }
  130. //소멸자
  131. function __destruct() {
  132. fclose($this->fh);
  133. }
  134. }
  135. $ip = 새 ip();
  136. $addr = $ip -> ('IP 주소');
  137. print_r($addr);
  138. ?>
코드 복사


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿