Забрана по ип адрес

systems

Registered
Добър ден опитвам се да направя скрипт които да показва реалния ип адрес на потребителя дори когато тои използва прокси и да обединя скрипта със скрипт за бан на ип адрес но сливането нещо не ми се получава моля за малко помощ:

ето кода ми:

PHP:
<?php
function ipCheck() {
if (getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
}

elseif (getenv('HTTP_X_REAL_IP')) {
$ip = getenv('HTTP_X_REAL_IP');
}

else {
$ip = $_SERVER['REMOTE_ADDR'];
}

return $ip;
}
echo ipCheck();


$baned = "127,0,0,1";
if($ip == $baned) {

echo "<div class='error'>blockk!!!</div>";
exit;
}
?>


а ето ги пооделно:
<?php
function ipCheck() {
if (getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
}

elseif (getenv('HTTP_X_REAL_IP')) {
$ip = getenv('HTTP_X_REAL_IP');
}

else {
$ip = $_SERVER['REMOTE_ADDR'];
}

return $ip;
}
echo ipCheck();
?>

PHP:
<?php
function ipCheck() {
if (getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
}

elseif (getenv('HTTP_X_REAL_IP')) {
$ip = getenv('HTTP_X_REAL_IP');
}

else {
$ip = $_SERVER['REMOTE_ADDR'];
}

return $ip;
}
echo ipCheck();
?>

PHP:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$baned = "";
if($ip == $baned) {

echo "<div class='error'>blockk!!!</div>";
exit;
}
?>


моля ви кажете ми къде греша и ако може малко помощ за реализацията на тази идея благодаря ви.
 
https://stackoverflow.com/a/5349693

You can look at the X-Forwarded-For HTTP header if one is sent, but there is no guaranteed way to know.

And to make it absolutely clear: THIS HEADER CANNOT BE TRUSTED unless ALL requests go through a proxy YOU control and no request can reach your server directly without either going through the proxy or that header being stripped somehow. There are so many PHP apps out there which simply use the IP from that header unconditionally if it's available... – ThiefMaster♦ Sep 22 '12 at 2:22

Това прегледа ли го? Сигурен ли си, че искаш да го направиш както си тръгнал?

+ идея: във функцията checkIP можеш вместо $ip = нещо_си да returnваш стойността директно, така няма да има нужда от else и ще е по-кратко и просто.
 
Идеята да блокираш перманентно потребители по IP Адрес не е много добра.

Помисли за случайте където потребителя ползва обществен wi-fi, VPN, динамично IP или просто мобилни данни
във всички тези случай този бан не само няма да помогне но и ще попречи на легитимни потребители да използват ресурса.

Имай в предвид че хедарите много лесно се променян и ако защитата ти е да разчиташ на хедъри то всеки който знае за тази схема може просто
да изпрати заявка с подправени хедъри и да заобиколи правилата.

в код-а по-долу се опитвам да избегна на това да се разчита само на хедър ако има такъв
и дали това което е в хедъра е валидно IP.

PHP:
<?php
/**
 * @return Array $ips
 */
function getVisitorIPs () {
    $ips = [];
    
    $headers = [
        'X-FORWARDED-FOR',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_X_CLUSTER_CLIENT_IP',
        'HTTP_X_REAL_IP',
        'HTTP_FORWARDED_FOR',
        'HTTP_FORWARDED',
        'HTTP_CLIENT_IP',
        'REMOTE_ADDR'
    ];
    
    foreach ($headers as $header) {
        $ip = getenv($header);
        $ip == '' ?: !inet_pton($ip) ?: $ips[] = $ip;
    }
    
    return $ips;
}

$ips = getVisitorIPs();
$banned = [
    '1.1.1.1',
    '2.2.1.1',
    '8.8.8.8',
];

foreach ($ips as $ip) {
    if (in_array($ip, $banned)) {
        echo "<div class='error'>blockk!!!</div>";
        die();
    }
}
?>
 

Горе