[php] 사용자가 PHP의 localhost에 있는지 어떻게 알 수 있습니까?
즉, 내 웹 응용 프로그램을 사용하는 사람이 해당 응용 프로그램이있는 서버에 있는지 어떻게 알 수 있습니까? 내가 올바르게 기억하면 PHPMyAdmin은 보안상의 이유로 이와 같은 작업을 수행합니다.
답변
$_SERVER['REMOTE_ADDR']
웹 서버에서 요청하는 클라이언트의 IP 주소를 사용할 수도 있습니다 .
$whitelist = array(
'127.0.0.1',
'::1'
);
if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
// not valid
}
답변
보완, 기능으로서 …
function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}
답변
새로운 OS 사용자 (Win 7, 8)는 화이트리스트 배열에 IPV6 형식 원격 주소를 포함해야 할 수도 있습니다.
$whitelist = array('127.0.0.1', "::1");
if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
// not valid
}
답변
$_SERVER["REMOTE_ADDR"]
사용자의 IP를 알려야합니다. 하지만 스푸핑이 가능합니다.
이 현상금 질문 에서 매우 자세한 토론을 확인하십시오 .
PHPMyAdmin으로 기억하는 것은 다른 것 같습니다. 많은 MySQL 서버는 보안상의 이유로 localhost에서만 액세스 할 수 있도록 구성되어 있습니다.
답변
미안하지만이 모든 대답은 나에게 끔찍한 것 같습니다. 어떤 의미에서 모든 기계가 “localhost”이기 때문에 질문을 바꾸는 것이 좋습니다.
문제는 다음과 같아야합니다. 실행되는 컴퓨터에 따라 다른 코드 경로를 어떻게 실행합니까?
제 생각에는 가장 쉬운 방법은 DEVMACHINE 또는 원하는 파일을 만든 다음 간단히 확인하는 것입니다.
file_exists ( ‘DEVMACHINE’)
라이브 호스팅 환경에 업로드 할 때이 파일을 제외해야합니다!
이 솔루션은 네트워크 구성에 의존하지 않고 스푸핑 될 수 없으며 실행중인 “라이브 코드”와 “개발 코드”간에 쉽게 전환 할 수 있습니다.
답변
이것은 $_SERVER['HTTP_HOST']
쉽게 위조되는 http 헤더의 값이기 때문에 사용해서는 안되는 것 같습니다 .
당신도 사용할 수 있습니다 $_SERVER["REMOTE_ADDR"]
. 이것은 더 안전한 값이지만 가짜도 가능합니다. 이것은 remote_addr
아파치 반환에 결과 주소입니다.
답변
고정 IP 및 동적 이름 을 지원 하는 화이트리스트 / 허용 목록 을 갖고 싶은 경우 .
예를 들면 :
$whitelist = array("localhost", "127.0.0.1", "devel-pc.ds.com", "liveserver.com");
if (!isIPWhitelisted($whitelist)) die();
이런 식으로 (확실히) 감지 할 수있는 이름 / IP 목록을 설정할 수 있습니다. 동적 이름은 다른 지점에서 액세스하는 데 더 많은 유연성을 추가합니다.
여기에는 두 가지 공통 옵션이 있습니다. 로컬 호스트 파일에 이름을 설정 하거나 어디에서나 찾을 수있는 하나의 동적 이름 공급자 를 사용할 수 있습니다.
이 함수는 gethostbyname이 매우 느린 함수이기 때문에 결과를 캐시합니다.
이를 위해이 기능을 구현했습니다.
function isIPWhitelisted($whitelist = false)
{
if ( isset($_SESSION) && isset($_SESSION['isipallowed']) )
{ return $_SESSION['isipallowed']; }
// This is the whitelist
$ipchecklist = array("localhost", "127.0.0.1", "::1");
if ($whitelist) $ipchecklist = $whitelist;
$iplist = false;
$isipallowed = false;
$filename = "resolved-ip-list.txt";
$filename = substr(md5($filename), 0, 8)."_".$filename; // Just a spoon of security or just remove this line
if (file_exists($filename))
{
// If cache file has less than 1 day old use it
if (time() - filemtime($filename) <= 60*60*24*1)
$iplist = explode(";", file_get_contents($filename)); // Read cached resolved ips
}
// If file was not loaded or found -> generate ip list
if (!$iplist)
{
$iplist = array(); $c=0;
foreach ( $ipchecklist as $k => $iptoresolve )
{
// gethostbyname: It's a VERY SLOW function. We really need to cache the resolved ip list
$ip = gethostbyname($iptoresolve);
if ($ip != "") $iplist[$c] = $ip;
$c++;
}
file_put_contents($filename, implode(";", $iplist));
}
if (in_array($_SERVER['REMOTE_ADDR'], $iplist)) // Check if the client ip is allowed
$isipallowed = true;
if (isset($_SESSION)) $_SESSION['isipallowed'] = $isipallowed;
return $isipallowed;
}
더 나은 안정성을 위해 @Pekka 가 “이 현상금 질문” 으로 자신의 게시물 에서 언급 한 get_ip_address ()에 대한 $ _SERVER [ ‘REMOTE_ADDR’] 을 대체 할 수 있습니다.