Как защититься от подменяемых http заголовков?
читать IP не из заголовков...
Отправить можно все что угодно.
$_SERVER['REMOTE_ADDR'] не из заголовков берется.
Если вы отправляете на сервер какой-либо собственный заголовок, то к нему добавляется префикс HTTP_. Для примера, если вы отправляете заголовок REMOTE_ADDR, то во всех скриптах на вашем сайте этот заголовок будет доступен как $_SERVER['HTTP_REMOTE_ADDR']Скриншот с примером собственного заголовка с IP
Это вывод ключей и значений массива $_SERVER. Как видно, переданный мной IP был записан в $_SERVER['HTTP_REMOTE_ADDR'], а настоящий IP записан, как полагается, в $_SERVER['REMOTE_ADDR']