PHP Classes

File: block_amazon_ips.php

Recommend this page to a friend!
  Classes of Rafael Martin Soto   PHP AWS Block   block_amazon_ips.php   Download  
File: block_amazon_ips.php
Role: Auxiliary script
Content type: text/plain
Description: Auxiliary script
Class: PHP AWS Block
Block accesses from computers hosted on Amazon WS
Author: By
Last change:
Date: 9 months ago
Size: 1,985 bytes
 

Contents

Class file image Download
<?php

/**
 * BLOCK AMAZON WS IP'S
 *
 * By Rafael Martín Soto: @rafainatica 2024
 *
 */

$jsonFile = 'https://ip-ranges.amazonaws.com/ip-ranges.json';


$cacheFile = __DIR__ . '/../cache/amazon_ips.cache.json';
$cacheFileCsv = $cacheFile.'.csv';
$updateInterval = 7 * 24 * 60 * 60; // 7 days in seconds

// Check if the cache file exists and if the update time has passed
if ( file_exists($cacheFileCsv) && time() - filemtime($cacheFileCsv) < $updateInterval) {
   
// Cache file is valid, load data from cache
   
$csvContent = file_get_contents($cacheFileCsv); // Set CSV Content
} else {
   
// Download the new JSON file
   
$jsonContent = file_get_contents($jsonFile);

    if(
$jsonContent === false || strlen($jsonContent) < 500000 ){
       
// SOME ERROR. LOAD PREVIOUS CACHE FILE
       
$jsonContent = file_get_contents($cacheFile);
    } else {
       
// Save the new content to the cache file
       
$jsonContent = str_replace( ["\r\n", "\r", "\n", ' '], '', $jsonContent); // Compress file
       
file_put_contents($cacheFile, $jsonContent); // Original file
   
}

   
// Prepare same file in .csv format (faster)
   
$ipData = json_decode($jsonContent, true);
   
$arrIps = [];
    foreach(
$ipData['prefixes'] as $prefix ){
       
$arrIps[] = $prefix['ip_prefix'];
    }
   
   
$csvContent = implode(',', $arrIps); // Set CSV Content

   
file_put_contents($cacheFileCsv, $csvContent); // .csvfile
}

// Decode the JSON to obtain an array of IP addresses
$ipData = explode(',', $csvContent);

$myIp = $_SERVER['REMOTE_ADDR'];

foreach(
$ipData as $ip ){
    if(
ip_in_range($myIp, $ip) ){
       
http_response_code(404);
        die();
    }
}

// Function to check if the client's IP address is in the specified range
function ip_in_range($ip, $range) {
    list(
$subnet, $mask) = explode('/', $range);
   
$subnet = ip2long($subnet);
   
$ip = ip2long($ip);
   
$mask = ~((1 << (32 - $mask)) - 1);

    return (
$ip & $mask) == ($subnet & $mask);
}
?>