사용자가 PHP의 localhost에 어떻게 알 수 있습니까?
즉, 내 웹 응용 프로그램을 사용하는 사람이 해당 응용 프로그램이있는 서버에 어떻게 알 수 있습니까? 내가 여기서 기억하면 PHPMyAdmin은 보안상의 M 이와 같은 작업을 수행합니다.
$_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 서버는 보안상의 MIS localhost에서 액세스 할 수 있도록 구성되어 있습니다.
이것은 $_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'] 을 대체 할 수 있습니다.
미안하지만 모든 대답은 나에게 끔찍한 것입니다. 어떤 의미에서 모든 기계가 "localhost"이기 때문에 바꾸는 것이 좋습니다.
문제는 다음과 같다고합니다. 실행되는 컴퓨터에 따라 다른 코드 경로를 어떻게 실행합니까?
제 생각에는 가장 쉬운 방법은 DEVMACHINE 또는 원하는 파일을 만든 다음 간단히 확인하는 것입니다.
file_exists ( 'DEVMACHINE')
라이브 호스팅 환경에 업로드 할 때이 파일을 제외해야합니다!
이 솔루션은 네트워크 구성에 의존하지 않고 스푸핑 될 수 없으며 실행중인 "라이브 코드"와 "개발 코드"간에 쉽게 전환 할 수 있습니다.
$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']
클라이언트가 서버와 동일한 시스템에 있는지 확인 하기 위해 비교 하는 것은 어떻습니까?
쉬운 답을 찾았습니다.
모든 로컬 드라이브에는 C : 또는 D : 또는 F : ... 등이 있기 때문입니다.
두 번째 문자가 다음과 같은지 감지하십시오.
if ( substr_compare(getcwd(),":",1,1) == 0)
{
echo '<script type="text/javascript">alert(" The working dir is at the local computer ")</script>';
$client_or_server = 'client';
}
else
{
echo '<script type="text/javascript">alert(" The working dir is at the server ")</script>';
$client_or_server = 'server';
}
참고 URL : https://stackoverflow.com/questions/2053245/how-can-i-detect-if-the-user-is-on-localhost-in-php
'IT' 카테고리의 다른 글
사용자에게 Chrome 확장 프로그램이 설치되어 있는지 확인 (0) | 2020.09.13 |
---|---|
h5py에 대한 입력 및 출력 numpy 배열 (0) | 2020.09.13 |
Rails html.erb 파일에서 줄을 주석 처리하는 방법은 무엇입니까? (0) | 2020.09.13 |
Coffeescript — 자체 시작 익명 함수를 만드는 방법은 무엇입니까? (0) | 2020.09.13 |
"ClickOnce는 요청 실행 수준 'requireAdministrator'를 지원하지 않습니다." (0) | 2020.09.13 |