>  기사  >  백엔드 개발  >  Discuz 50에서 Innocence IP 데이터베이스 읽기 기능 분석

Discuz 50에서 Innocence IP 데이터베이스 읽기 기능 분석

WBOY
WBOY원래의
2016-07-29 08:36:411071검색

Discuz 5.0은 더 이상 자체 IP 데이터를 사용하지 않고 Innocence IP의 데이터 형식을 사용합니다. Innocence IP 데이터베이스에 액세스하는 것은 약간 번거롭습니다. 특정 형식 분석은 다음 두 링크를 참조하십시오. 다른 언어로 구현 기사 마지막에 있는 링크를 참조하세요.
"무죄 IP 데이터베이스 형식에 대한 자세한 설명"
링크 1: http://blog.csdn.net/heiyeshuwu/archive/2006/05/12/725675.aspx
링크 2: http:/ /lumaqq .linuxsir.org/article/qqwry_format_detail.html
무고한 IP 데이터베이스 공식 웹사이트: http://www.cz88.net/ip/
무고한 IP 데이터베이스 다운로드: http://update.cz88.net /soft/ qqwry.rar
Disuz!5_GBK/upload/include/misc.func.php 경로에 다음 함수 conrvertip()가 있으니 관심 있으신 분들은 자세히 읽어보시고 분석해 보시면 됩니다.(아래 코드는 읽기 쉽게 간단하게 수정했으며, 핵심은 수정하지 않았습니다)
<
//============= ======== ==============
//
// 기능: IP 주소가 실제 주소를 가져오는 기능
// 매개변수: $ip - IP 주소
// 작성자 :[Discuz!] (C) Comsenz Inc.
//
//===================== =========== ======
function Convertip($ip) {
//IP 데이터 파일 경로
$dat_path = 'QQWry.Dat'
//IP 주소 확인
if( !preg_match("/^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/", $ip )) {
return 'IP 주소 오류';
}
//IP 데이터 파일 열기
if(!$fd = @fopen($dat_path, 'rb')){
return 'IP 날짜 파일이 없거나 접근이 거부되었습니다' ;
}
//작업을 위해 IP를 분해하고 정수를 얻습니다.
$ip =explore('.', $ip); ipNum = $ip[0] * 16777216 $ip [1] * 65536 $ip[2] * 256 $ip[3]
//IP 데이터 인덱스의 시작 및 끝 위치 가져오기
$DataBegin = fread($fd, 4);
$DataEnd = fread($fd, 4);
$ipbegin = implode('', unpack('L', $DataBegin))
if($ ipbegin < 0) $ipbegin = pow(2, 32 )
$ipend = implode('', unpack('L', $DataEnd))
if($ipend < 0) $ipend = pow(2, 32);
$ipAllNum = ($ipend - $ipbegin) / 7 1;
$BeginNum = 0
$EndNum = $ipAllNum; 인덱스 레코드에서 일치하는 IP 레코드를 검색하는 방법
while($ip1num>$ipNum || $ip2num<$ipNum) {
$Middle= intval(($EndNum $BeginNum) / 2); //인덱스 위치로 포인터를 오프셋하고 4단어를 읽습니다. 섹션
fseek($fd, $ipbegin 7 * $Middle)
$ipData1 = fread($fd, 4)
if(strlen ($ipData1) < 4) {
fclose ($fd);
return 'System Error';
}
//추출된 데이터는 긴 정수로 변환됩니다. 음수인 경우 32제곱에 2를 더합니다.
$ip1num = implode ('', unpack('L', $ipData1))
if($ip1num < 0) $ip1num = pow(2, 32);
//추출된 긴 정수가 우리 IP보다 큽니다. 다음 주기를 위해 주소가 수정됩니다.
if($ip1num > $ipNum) {
$EndNum = $Middle
continue;
}
//이전 인덱스를 마친 후 다음 인덱스를 제거합니다.
$DataSeek = fread($fd, 3)
if(strlen($DataSeek) < 3) {
fclose($fd);
return '시스템 오류';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0))) 🎜> fseek($fd, $DataSeek);
$ipData2 = fread($fd, 4)
if(strlen($ipData2) < 4) {
fclose($fd); 🎜> '시스템 오류'를 반환합니다.
}
$ip2num = implode('', unpack('L', $ipData2));
if($ip2num < 0) $ip2num = pow(2, 32)
//찾을 수 없음 프롬프트 알 수 없음
if($ip2num < $ipNum) {
if($Middle == $BeginNum) {
'; > if($ipFlag == chr(1)) {
$ipSeek = fread($fd, 3)
if(strlen($ipSeek) < 3) {
fclose ($fd); ;
'시스템 오류' 반환
}
$ipSeek = implode('', unpack('L', $ipSeek.chr(0)))
fseek( $fd, $ ipSeek);
$ipFlag = fread($fd, 1);
}
if($ipFlag == chr(2)) {
$AddrSeek = fread($fd , 3);
if(strlen($AddrSeek) < 3) {
fclose($fd);
return '시스템 오류'; fread($ fd, 1)
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) { } else {
fseek($fd, -1, SEEK_CUR)
}
while(($char = fread ($fd, 1) ) ! = chr(0))
$ipAddr2 .= $char;
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)))
fseek( $fd , $AddrSeek);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char
}else {
fseek($fd, -1, SEEK_CUR);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3)
if(strlen( $AddrSeek2) < 3) {
                                                                      '', unpack('L', $AddrSeek2. chr(0))));
                                          while(($ char = fread($fd, 1)) != chr (0)){
$ipAddr2 .= $char;
}
}
fclose($fd)
// 마지막으로 해당 교체 작업을 수행하고 결과를 반환합니다
if(preg_match('/http/i', $ipAddr2)) {
$ipAddr2 = '';
}
$ipaddr = "$ipAddr1 $ipAddr2"
$ipaddr = preg_replace ('/CZ88.NET/is', '', $ipaddr)
$ipaddr = preg_replace('/^s*/is', '', $ipaddr )
$ipaddr = preg_replace(' /s*$/is', '', $ipaddr)
if(preg_match('/http/i', $ipaddr) || $ipaddr == ' ') {
$ipaddr = '알 수 없음 ';
}
$ipaddr 반환
}
//=============== =======
//
// 호출 예시(매우 빠름)
//
//================ ========
echo Convertip('219.238.235.10');
//출력: Beijing Telecom
echo Convertip('23.56.82.12')
// 출력: IANA
echo Convertip('250.69.52.0 ');
//출력: IANA 예약된 주소
echo Convertip('238.69.52.0')
//출력: IANA 예약된 주소 멀티캐스트 전송에 사용
echo Convertip('192.168.0.1) ');
//출력: LAN 상대방이 귀하와 동일한 인트라넷에 있습니다.
echo Convertip('255.255.255.255')
// 출력: 2006년 11월 20일의 Innocence Network IP 데이터
?>

이상은 무고한 IP 데이터베이스의 내용을 포함하여 Discuz 50의 무고한 IP 데이터베이스를 읽는 기능에 대한 분석을 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.