Php ile IP tespiti ve IP engelleme

klamhat

Üye
8 Ocak 2011
103
46
Merhaba,

Öncelikle şunu söyleyeyim gece gece çok uğraşmak istemedim ama foruma konu da açmak istedim o yüzden çok basic bi proje bunun farkındayım.

bazı şeyler eklenebilir mesela blocked.php sayfasını sadece engellenen ip adreslerinin görmesi gibi vs vs

neyse kodlara gelelim ;

index.php : bu sayfada kullanıcının ip adresi tespit ediliyor ve ipinfo servisi aracılığıyla ip ile ilgili detaylar gösteriliyor. 1 dakika aynı ip adresi 5'ten fazla istek gönderirse o ip adresi 5 dakika boyunca engelleniyor. bu "time" adında çerez ile kontrol ediliyor ve süre dolunca ya da kullanıcı çerezleri temizlediğinde kullanıcı index.php ye erişmeye devam edebilyor.
PHP:
<?php
session_start();

if (!isset($_SESSION['blocked_ips'])) {
    $_SESSION['blocked_ips'] = [];
}

if (in_array(getUserIP(), $_SESSION['blocked_ips'])) {
    if(isset($_COOKIE['unblock_time']) && time() < $_COOKIE['unblock_time']){
        header("Location: blocked.php");
        exit();
    } else {
        unset($_SESSION['blocked_ips'][array_search(getUserIP(), $_SESSION['blocked_ips'])]);
        header("Location: index.php");
        exit();
    }
}

function getUserIP() {
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

$ip_info = file_get_contents('https://ipinfo.io/json');
$ip_data = json_decode($ip_info);
$user_ip = $ip_data->ip;

if (!isset($_SESSION['request_count'])) {
    $_SESSION['request_count'] = [];
}

if (!isset($_SESSION['request_count'][$user_ip])) {
    $_SESSION['request_count'][$user_ip] = 0;
}

$_SESSION['request_count'][$user_ip]++;

$max_requests = 5;
$request_time_window = 10;

if ($_SESSION['request_count'][$user_ip] > $max_requests) {

    $_SESSION['blocked_ips'][] = $user_ip;
    
    $unblock_time = time() + 300;
    
    setcookie('unblock_time', $unblock_time, time() + 300, '/');
    
    header("Location: blocked.php");
    exit();
}

echo "<h1>Kullanıcının Dış IP Adresi ve Detayları</h1>";
echo "<p><strong>IP Adresi:</strong> " . $user_ip . "</p>";
echo "<p><strong>Hostname:</strong> " . $ip_data->hostname . "</p>";
echo "<p><strong>Şehir:</strong> " . $ip_data->city . "</p>";
echo "<p><strong>Bölge:</strong> " . $ip_data->region . "</p>";
echo "<p><strong>Ülke:</strong> " . $ip_data->country . "</p>";
echo "<p><strong>Posta Kodu:</strong> " . $ip_data->postal . "</p>";
echo "<p><strong>Zaman Dilimi:</strong> " . $ip_data->timezone . "</p>";
echo "<p><strong>ASN:</strong> " . $ip_data->org . "</p>";
?>

7sjdstw.png


blocked.php : bu sayfaya engellenen ip adresleri 5 dakika boyunca yönlendiriliyor ama dediğim gibi basic düzeyde kodladım foruma konu açmadan pc yi kapatmak istemedim. Mesela tekrar söyleyeyim blocked.php sayfasını sadece engellenen ip adreslerinin görmesi gibi özellikler eklenebilir elbette. eğer isterseniz daha gelişmiş şekilde kodlayıp konusunu açarım.
PHP:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Engellendi</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .container {
            background-color: #fff;
            border-radius: 10px;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
            padding: 20px;
            max-width: 400px;
            width: 100%;
            text-align: center;
        }

        h1 {
            color: #333;
        }

        p {
            color: #666;
            line-height: 1.6;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Engellendiniz!</h1>
        <p>Bir süre boyunca çok fazla istek yaptığınız için engellendiniz. Lütfen birkaç dakika sonra tekrar deneyin.</p>
    </div>
</body>
</html>

raarn0u.png
 

EX

Moderatör
29 Mar 2020
1,910
5
1,249
El emeğine sağlık. Başarılı çalışma (y)
 

ATE$

Katılımcı Üye
9 Kas 2021
376
169
Siber Şubede geziyor.
Merhaba,

Öncelikle şunu söyleyeyim gece gece çok uğraşmak istemedim ama foruma konu da açmak istedim o yüzden çok basic bi proje bunun farkındayım.

bazı şeyler eklenebilir mesela blocked.php sayfasını sadece engellenen ip adreslerinin görmesi gibi vs vs

neyse kodlara gelelim ;


index.php : bu sayfada kullanıcının ip adresi tespit ediliyor ve ipinfo servisi aracılığıyla ip ile ilgili detaylar gösteriliyor. 1 dakika aynı ip adresi 5'ten fazla istek gönderirse o ip adresi 5 dakika boyunca engelleniyor. bu "time" adında çerez ile kontrol ediliyor ve süre dolunca ya da kullanıcı çerezleri temizlediğinde kullanıcı index.php ye erişmeye devam edebilyor.
PHP:
<?php
session_start();

if (!isset($_SESSION['blocked_ips'])) {
    $_SESSION['blocked_ips'] = [];
}

if (in_array(getUserIP(), $_SESSION['blocked_ips'])) {
    if(isset($_COOKIE['unblock_time']) && time() < $_COOKIE['unblock_time']){
        header("Location: blocked.php");
        exit();
    } else {
        unset($_SESSION['blocked_ips'][array_search(getUserIP(), $_SESSION['blocked_ips'])]);
        header("Location: index.php");
        exit();
    }
}

function getUserIP() {
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

$ip_info = file_get_contents('https://ipinfo.io/json');
$ip_data = json_decode($ip_info);
$user_ip = $ip_data->ip;

if (!isset($_SESSION['request_count'])) {
    $_SESSION['request_count'] = [];
}

if (!isset($_SESSION['request_count'][$user_ip])) {
    $_SESSION['request_count'][$user_ip] = 0;
}

$_SESSION['request_count'][$user_ip]++;

$max_requests = 5;
$request_time_window = 10;

if ($_SESSION['request_count'][$user_ip] > $max_requests) {

    $_SESSION['blocked_ips'][] = $user_ip;
   
    $unblock_time = time() + 300;
   
    setcookie('unblock_time', $unblock_time, time() + 300, '/');
   
    header("Location: blocked.php");
    exit();
}

echo "<h1>Kullanıcının Dış IP Adresi ve Detayları</h1>";
echo "<p><strong>IP Adresi:</strong> " . $user_ip . "</p>";
echo "<p><strong>Hostname:</strong> " . $ip_data->hostname . "</p>";
echo "<p><strong>Şehir:</strong> " . $ip_data->city . "</p>";
echo "<p><strong>Bölge:</strong> " . $ip_data->region . "</p>";
echo "<p><strong>Ülke:</strong> " . $ip_data->country . "</p>";
echo "<p><strong>Posta Kodu:</strong> " . $ip_data->postal . "</p>";
echo "<p><strong>Zaman Dilimi:</strong> " . $ip_data->timezone . "</p>";
echo "<p><strong>ASN:</strong> " . $ip_data->org . "</p>";
?>

7sjdstw.png


blocked.php : bu sayfaya engellenen ip adresleri 5 dakika boyunca yönlendiriliyor ama dediğim gibi basic düzeyde kodladım foruma konu açmadan pc yi kapatmak istemedim. Mesela tekrar söyleyeyim blocked.php sayfasını sadece engellenen ip adreslerinin görmesi gibi özellikler eklenebilir elbette. eğer isterseniz daha gelişmiş şekilde kodlayıp konusunu açarım.
PHP:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Engellendi</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .container {
            background-color: #fff;
            border-radius: 10px;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
            padding: 20px;
            max-width: 400px;
            width: 100%;
            text-align: center;
        }

        h1 {
            color: #333;
        }

        p {
            color: #666;
            line-height: 1.6;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Engellendiniz!</h1>
        <p>Bir süre boyunca çok fazla istek yaptığınız için engellendiniz. Lütfen birkaç dakika sonra tekrar deneyin.</p>
    </div>
</body>
</html>

raarn0u.png
Bence daha da geliştirilebilir. Mesela biraz daha fazla bilgi olan birisi vpn açıp tekrardan siteye erişim sağlayabilir. Bunu da engellemenin bir yolu vardır muhtemelen.
 

klamhat

Üye
8 Ocak 2011
103
46
Teşekkürler
El emeğine sağlık. Başarılı çalışma (y)
Teşekkür ederim hocam
Emeğine sağlık.
teşekkür eederim
Eline emeğine sağlık,
Bu tarz kodlar yazarak tabi daha ileri seviye para vermeden kendi ağınızı koruyabilirsiniz.
Teşekkürler.
Teşekkür ederim, evet katılıyorum.
Bence daha da geliştirilebilir. Mesela biraz daha fazla bilgi olan birisi vpn açıp tekrardan siteye erişim sağlayabilir. Bunu da engellemenin bir yolu vardır muhtemelen.
Teşekkürler, evet vpn ile tekrar erişemez çerezleri silmesi gerekir tarayıcıdan.

Ayrıca konuda iki defa bahsettim basit bir proje diye :)
 

tamam ağa

Uzman üye
7 Haz 2023
1,534
13
876
Bu kadar çok uzun kod yazmana gerek yoktu daha kısa kodlada bu problem çözülebilir. ek olarak engellemeyi cookie yerine bir sunucuda yapabilirsin bu sayede user tarafından müdahale şansı azalır.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.