예를 들어, 모든 IP를 89.95 (89.95. .)부터 차단하고 싶습니다. 내 서버에 .htaccess
개의 파일이 없으므로 PHP로 처리해야합니다.PHP의 내 웹 사이트에서 특정 IP 블록을 차단하십시오.
if ($_SERVER['REMOTE_ADDR'] == "89.95.25.37") die();
특정 IP를 차단합니다. 전체 IP 블록을 어떻게 차단합니까?
대단히 감사합니다. 당신이 발견하는 경우
예를 들어, 모든 IP를 89.95 (89.95. .)부터 차단하고 싶습니다. 내 서버에 .htaccess
개의 파일이 없으므로 PHP로 처리해야합니다.PHP의 내 웹 사이트에서 특정 IP 블록을 차단하십시오.
if ($_SERVER['REMOTE_ADDR'] == "89.95.25.37") die();
특정 IP를 차단합니다. 전체 IP 블록을 어떻게 차단합니까?
대단히 감사합니다. 당신이 발견하는 경우
는 ===
운영자는 89.95
는 IP 주소의을 태초 에 있는지 확인합니다,
if(strpos($_SERVER['REMOTE_ADDR'], "89.95") === 0)
{
die();
}
strpos()
을보십시오. 즉, 원하는만큼 IP 주소를 구분할 수 있으며 그 다음에 오는 숫자가 무엇이든간에 차단됩니다.
는 예를 들어,이 모두 차단됩니다 :
89.95 ->89.95.12.34
, 89.95.1234.1
, 89.95.1.1
89.95.6 ->89.95.65.34
, 89.95.61.1
, 89.95.6987
(그 중 일부 그래도 유효한 IP 주소가 아님)
부분 문자열 만들기 : 예를 들어 89.95.25. *를 차단하는 경우 IP의 하위 문자열을 만들고 마지막 두 숫자를 잘라내어 "89.95.25"와 비교합니다.
는 정수로 점선 쿼드로 변환 :
$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR']));
// only allow 10.0.0.0 – 10.255.255.255
if (!($ip >= 167772160 && $ip <= 184549375)) {
die('Forbidden.');
}
정수를 사용하는 이유는 무엇입니까? 코드를 더 모호하게 만들었습니까? – zerkms
이 대답은이 답변의 유용성을 떨어 뜨리지는 않지만 인증은 선택한 사람들 그룹이 승인 된 더 많은 선택 단어로 들립니다. 이 경우 소수의 사용자 만 승인하는 대신 권한이 없거나 소수의 사용자를 금지합니다. 따라서, 나는 더 나은 단어가 '금단의 것'이라고 생각할 것이다. –
@ Chacha102 : 나는 편집했다. – webbiedave
사용 ip2long()
실제 IP 주소를 점으로 구분 된 십진수로 변환 할 수 있습니다. 그렇다면 쉽게 범위를 지정할 수 있습니다.
높고 낮은 범위에서 값을 얻으려면 ip2long()
을 수행 한 다음이를 코드의 상수로 사용하십시오. 당신은 서브넷 마스크에 익숙하다면
, 당신은 이런 식으로 작업을 수행 할 수 있습니다
// Deny 10.12.*.*
$network = ip2long("10.12.0.0");
$prefix = 16;
$ip = ip2long($_SERVER['REMOTE_ADDR']);
if ($network >> (32 - $prefix)) == ($ip >> (32 - $prefix)) {
die("Unauthorized");
}
당신은에 다음을 설정할 수 있습니다 :
// Deny 10.12.*.*
$network = ip2long("10.12.0.0");
$mask = ip2long("255.255.0.0");
$ip = ip2long($_SERVER['REMOTE_ADDR']);
if (($network & $mask) == ($ip & $mask)) {
die("Unauthorized");
}
을 또는 당신은이 형식 10.12.0.0/16
에 대해 잘 알고 있다면 IP 주소를 추가하고 범위를 쉽게 사용자 정의 할 수있는 매우 관리하기 쉬운 코드가 있습니다. 적절한 서버 변수 이 검사를하고 알려진 IP 목록과 비교합니다 .. 그리고 예, PHP는 IP와 내 * 그래서 사용, 와일드 카드를 이해하지 :
감사! 이것이 우리가하는 방식입니다. – Ami
'$ _SERVER { 'REMOTE_HOST'}'만 조사하면 충분할까요? 어쩌면 사용자가 프록시를 사용하기 때문일 수도 있습니다. 따라서 'REMOTE_ADDR' 또는 [these] (http://stackoverflow.com/questions/15699101/get-the-client-ip-address-using-php#15699240)와 같이 확인해야하는 다른 매개 변수가 있습니다. 내가 맞습니까? 또는 내가 링크 한 것을하는 것이 유용하지 않은가? – stack
네, 그냥 REMOTE_ADDR을 사용하십시오. –
$user_ip = $_SERVER['REMOTE_ADDR']; // get user ip
$denyIPs = array("111.111.111", "222.222.222", "333.333.333");
if (in_array ($user_ip, $denyIPs)) {
// blocked ip
}
else {
// not blocked
}
안녕하세요.이 형식을 222.222.222.0/15로 사용하려했지만 작동하지 않았습니다 ... –
이 항상 저를 위해 아주 잘 근무하고있다 IP 범위를 차단하는 데 도움이됩니다.
// The blacklisted ips.
$denied_ips = array(
'1.2.3.4',
'2.3.*',
);
// The function to get the visitor's IP.
function getUserIP(){
//check ip from share internet
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
//to check ip is pass from proxy
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
//The user
$visitorIp = getUserIP();
// Now let's search if this IP is blackliated
$status = array_search($visitorIp, $denied_ips);
// Let's check if $status has a true OR false value.
if($status !== false){
echo '<div class="error">Your IP has been banned! Stop spamming us!</div>';
// header("Location: http://zombo.com");
// exit;
}
는 부패하기 쉬운 보도에 좋은 기사 있습니다 : http://perishablepress.com/how-to-block-ip-addresses-with-php/
"그렇습니다. PHP는 와일드 카드를 인식하므로 IP 범위 내에서 IP 범위를 차단하는 데 도움이됩니다." 확실한가요? 아마 PHP의 특정 버전? – artfulhacker
헤더 리디렉션을 사용하는 배열 거부 기능이 작동합니다. :) – PipBoy2000
와일드 카드 검색
// Now let's search if this IP is blackliated
$status = false;
foreach($denied_ips as $val)
{
if (strpos($val,'*') !== false)
{
if(strpos($visitorIp, array_shift(explode("*", $val))) === 0)
{
$status = true;
break;
}
}
else
{
if(strcmp($visitorIp, $val) === 0)
{
$status = true;
break;
}
}
}
$deny = array("111.111.111", "222.222.222", "333.333.333");
if (in_array($_SERVER['REMOTE_ADDR'], $deny)) {
header("location:http://www.google.com/");
exit();
}
도니는 다르게 작업 얻기 위해 이것을 사용,의 코드를 부흥 사용하여, 나는 놀랐어요'그 strpos'는'substr'보다 더 빨리 작동합니다. – zerkms
@zerkms 정말 놀라지 않아야합니다. - 테스트가 실패 할 경우'strpos'가 즉시 리턴 할 수 있고, 그렇게하지 않아도됩니다 모든 문자열 복사 또는 할당. 또한'=='을'==='로 바꾸면 행동이 바뀌므로주의하지 않으면 안됩니다. 세 개의 등호를 사용하십시오. – gnud
@gnud : 긴 문자열의 경우 strpos가 느려질 수 있습니다. 바늘을 검색하기 위해 전체 문자열을 반복해야하기 때문입니다. 그리고 나는'==='와'=='의 차이점을 알고 있습니다. – zerkms