[php] $ _SERVER [ ‘REMOTE_ADDR’]을 신뢰하는 것이 안전합니까?
신뢰하는 것이 안전 $_SERVER['REMOTE_ADDR']
합니까? 요청의 헤더를 변경하거나 이와 유사한 것으로 대체 할 수 있습니까?
그런 식으로 쓰는 것이 안전한가요?
if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
$grant_all_admin_rights = true;
}
답변
예, 안전합니다. TCP 연결의 소스 IP이며 HTTP 헤더를 변경하여 대체 할 수 없습니다.
걱정할 수있는 한 가지 경우는 역방향 프록시 뒤에있는 경우입니다.이 경우 REMOTE_ADDR은 항상 프록시 서버의 IP이고 사용자 IP는 HTTP 헤더 (예 : X-Forwarded-For)에 제공됩니다. ). 그러나 일반적인 사용 사례의 경우 REMOTE_ADDR을 읽는 것이 좋습니다.
답변
$_SERVER['REMOTE_ADDR']
TCP 연결이 들어온 IP 주소입니다. 인터넷에서 IP 주소를 양방향으로 스푸핑하는 것이 기술적으로 가능하지만 (BGP를 통해 파울 라우트를 발표함으로써) 이러한 공격은 발견 될 가능성이 높고 일반적인 공격자는 사용할 수 없습니다. 기본적으로 공격자는 ISP 또는 통신 업체를 제어해야합니다. TCP에 대한 가능한 단방향 스푸핑 공격은 없습니다 (아직). LAN에서는 양방향 IP 스푸핑이 사소합니다.
또한 IPv4가 아니라 IPv6 주소 일 수 있습니다. 현재 체크는 점에서 괜찮지 만, 당신이 체크 할 경우 1.2.3.4
에만 발생 어디 에서 $_SERVER['REMOTE_ADDR']
, 공격자는 단순히에서 연결할 수 있습니다 2001:1234:5678::1.2.3.4
.
요약하자면, 중요한 (은행 / 군사 / 잠재적 피해> 50.000 €) 애플리케이션 이외의 경우 로컬 네트워크에서 공격자를 제외 할 수있는 경우 원격 IP 주소를 사용할 수 있습니다.
답변
위에서 언급했듯이 절대적으로 안전하지 않습니다. 하지만 사용하지 말아야한다는 의미는 아닙니다. 이를 다른 인증 방법 (예 : COOKIE 값 확인)과 결합하는 것을 고려하십시오.