Skip to content

Instantly share code, notes, and snippets.

@Coopeh
Last active June 1, 2019 10:46
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Coopeh/931d5cb93587aa816bda553580bd8a56 to your computer and use it in GitHub Desktop.
Save Coopeh/931d5cb93587aa816bda553580bd8a56 to your computer and use it in GitHub Desktop.
<?php $time_start = microtime(true);
// Add multiple IPs to blacklist, whitelist or unlist them on Cloudflare using CloudFlare API by AzzA <azza@broadcasthe.net>
// Ed Cooper 2015 - https://blog.ed.gs
// Version 1.0
// Configure your API key and email address below
$cfemailaddress = "your@email.com"; // Cloudflare email address
$cfapikey = "1234123412341234123412341234"; // Cloudflare API key
$type = "Whitelist"; // Use either Whitelist, Blacklist or Unlist as options
// Use either $url, $ips or both, but make sure the URL address is a line break separated list of IPs, comment and uncomment the lines as needed
$url = "https://www.statuscake.com/API/Locations/txt"; // Web address for line break separated list of IPs
$ips = array("128.199.222.65","188.166.158.224","5.45.179.103","199.167.128.80","185.157.211.211","162.248.97.72","37.235.53.240","162.253.64.104","192.241.221.11","50.2.139.16","108.61.162.214","37.235.48.42","158.255.208.76","125.63.48.239","185.12.45.70","103.194.112.70","213.183.56.107","217.148.43.188","91.236.116.163","37.235.55.205","217.148.43.202","45.63.104.11","45.32.151.21","107.170.227.23","107.170.227.24","188.226.169.228","188.226.185.106","188.226.186.199","107.155.108.234","188.226.171.58","108.61.119.153","188.226.158.160","107.170.240.141","107.161.28.219","107.155.104.182","107.155.125.29","178.62.78.199","209.222.30.242","46.101.74.251","108.61.212.141","178.62.65.162","178.62.109.7","188.226.247.184","188.226.139.158","188.226.184.152","178.62.106.84","104.131.248.65","104.131.248.78","46.101.61.83","104.131.247.151","178.62.86.69","107.170.197.248","107.170.219.46","188.226.203.84","178.62.41.44","178.62.41.49","178.62.41.52","162.243.71.56","178.62.40.233","162.243.247.163","107.170.53.191","31.220.7.237","178.62.80.93","178.62.71.227","178.73.210.99","181.41.214.137","154.127.60.59","185.112.157.185","46.101.240.208","46.101.238.182","46.101.238.189","46.101.27.186","178.62.104.137","193.182.144.147","159.203.31.18","149.154.157.61","138.204.171.136","185.60.135.86","154.127.60.23","188.166.253.148","37.157.246.146","46.101.110.43","46.101.110.45","178.62.101.57","46.101.0.24","46.101.20.96","46.101.110.32","82.221.95.161","37.235.52.25","37.97.188.103","151.236.18.80","185.47.129.168","37.235.48.146","91.239.125.60","139.59.15.79","193.182.144.105","45.63.121.159","45.32.145.79","181.41.201.117","151.236.10.129","151.80.175.226","185.173.92.161","185.135.81.201","138.68.24.60","107.191.47.131","138.68.24.115","138.68.24.136","138.68.24.207","138.197.140.243","138.197.130.232","138.197.130.235","139.59.155.26","138.68.80.173","139.59.190.241","138.68.80.10","139.59.29.167","45.63.88.213","45.63.86.120","45.32.128.80","104.156.229.24","45.32.212.56","104.156.255.184","108.61.215.179","45.32.166.195","45.32.160.172","45.32.171.24","107.191.57.237","45.63.26.78","45.76.192.50","45.32.36.158","139.59.26.85","139.59.22.109","104.238.164.105","45.63.76.68","45.63.78.84","45.32.195.186","45.76.3.112","45.76.1.44","45.32.7.22","159.203.186.225","159.203.182.22","159.203.182.60","45.63.51.63","45.63.61.213","108.61.205.201","45.32.192.198","45.32.195.93","104.206.168.26","138.68.151.78","45.63.97.4","104.238.185.175","104.238.185.46","104.238.186.209","45.76.128.250","104.238.171.176","104.238.187.61","104.238.174.234","108.61.196.37","108.61.197.147","45.76.134.164","45.76.135.253","108.61.173.0","45.63.96.68","45.76.134.85","45.32.183.128","45.76.130.43","45.76.129.212","45.76.134.198","45.76.134.237","45.76.135.14","217.78.0.117","217.78.0.171","2a03:b0c0:1:a1::2d:6001","2001:19f0:7001:18cd:5400:00ff:fe03:86f7","2001:19f0:9002:18b:5400:00ff:fe46:338d","2001:19f0:6801:b6:5400:00ff:fe2d:9386","2a03:b0c0:0:1010::386:7001","2a03:b0c0:0:1010::39c:2001","2a03:b0c0:0:1010::539:9001","2001:19f0:5c01:1a9:5054:00ff:feb5:3dfd","2a03:b0c0:0:1010::385:4001","2604:a880:1:20::f64:c001","2a03:b0c0:1:d0::5e:f001","2001:19f0:7402:1ab:5054:00ff:fec5:d750","2a03:b0c0:1:d0::df:6001","2001:19f0:5801:20d:5054:00ff:fea5:ffcc","2a03:b0c0:1:d0::df:4001","2a03:b0c0:1:d0::df:b001","2a03:b0c0:0:1010::349:e001","2a03:b0c0:0:1010::3a5:1","2a03:b0c0:1:d0::df:3001","2604:a880:0:1010::d3d:a001","2a03:b0c0:1:d0::d0:3001","2604:a880:0:1010::56:6001","2a03:b0c0:1:d0::df:a001","2a03:b0c0:1:d0::5b:a001","2a03:b0c0:1:d0::5b:c001","2a03:b0c0:1:d0::5c:2001","2604:a880:0:1010::d32:6001","2604:a880:0:1010::d32:5001","2a03:b0c0:1:d0::2e5:1001","2a03:b0c0:1:d0::2e5:2001","2a03:b0c0:3:d0::173:b001","2a03:b0c0:3:d0::179:a001","2a03:b0c0:3:d0::179:b001","2a03:b0c0:1:d0::91:5001","2001:b60:1000:149:154:157:61:1","2a03:b0c0:3:d0::216:9001","2a03:b0c0:3:d0::216:a001","2a03:b0c0:1:d0::44f:1","2a03:b0c0:1:d0::1de:6001","2a03:b0c0:3:d0::b61:9001","2400:6180:100:d0::8e:e001","2a03:f80:972:193:182:144:105:1","2001:19f0:7001:76c:5400:00ff:fe2c:0bea","2001:19f0:6801:ba:5400:00ff:fe2e:556f","2001:19f0:ac01:1e2:5400:00ff:fe37:00e9","2001:19f0:ac01:195:5400:00ff:fe37:00ea","2001:19f0:ac01:1b7:5400:00ff:fe37:00eb","2001:19f0:ac01:1dc:5400:00ff:fe37:00ec","2001:19f0:5401:b8:5400:00ff:fe37:00fa","2001:19f0:5401:b6:5400:00ff:fe37:00fb","2001:19f0:5401:b7:5400:00ff:fe37:00fd","2001:19f0:9002:138:5400:00ff:fe37:02a1","2001:19f0:9002:17d:5400:00ff:fe37:02a2","2001:19f0:9002:17e:5400:00ff:fe37:02a3","2001:19f0:5801:20f:5400:00ff:fe37:027f","2001:19f0:5801:20e:5400:00ff:fe37:027e","2001:19f0:7001:18d6:5400:00ff:fe37:0412","2001:19f0:7001:18c4:5400:00ff:fe37:0413","2001:19f0:5c01:156:5400:00ff:fe37:080b","2001:19f0:5c01:163:5400:00ff:fe37:080c","2001:19f0:5c01:1a6:5400:00ff:fe37:080d","2001:19f0:6401:14a:5400:00ff:fe37:0870","2001:19f0:5:33f:5400:00ff:fe37:2d7b","2001:19f0:5:340:5400:00ff:fe37:2d7d","2001:19f0:5:342:5400:00ff:fe37:2d7f","2604:a880:400:d0::a27:6001","2604:a880:400:d0::a27:7001","2604:a880:400:d0::a27:8001","2001:19f0:6001:4ad:5400:00ff:fe37:2e33","2001:19f0:6001:27c:5400:00ff:fe37:2e79","2001:19f0:6401:12d:5400:00ff:fe37:2eb2","2001:19f0:6401:14c:5400:00ff:fe37:2eb7","2001:19f0:6401:93:5400:00ff:fe37:2eeb","2a03:b0c0:1:a1::821:b001","2001:19f0:7402:20f:5400:00ff:fe47:8333"); // Statuscake IPs
// STOP EDITING NOW
function get_data($url) {
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
class cloudflare_api
{
// The URL of the API
private static $URL = array(
'USER' => 'https://www.cloudflare.com/api_json.html',
'HOST' => 'https://api.cloudflare.com/host-gw.html'
);
// Timeout for the API requests in seconds
const TIMEOUT = 5;
// Stores the api key
private $token_key;
private $host_key;
// Stores the email login
private $email;
/**
* Make a new instance of the API client
*/
public function __construct()
{
$parameters = func_get_args();
switch (func_num_args()) {
case 1:
// a host API
$this->host_key = $parameters[0];
break;
case 2:
// a user request
$this->email = $parameters[0];
$this->token_key = $parameters[1];
break;
}
}
public function setEmail($email)
{
$this->email = $email;
}
public function setToken($token_key)
{
$this->token_key = $token_key;
}
/**
* CLIENT API
* Section 3
* Access
*/
/**
* 4.7a - Whitelist IPs
* You can add an IP address to your whitelist.
*/
public function wl($ip)
{
$data = array(
'a' => 'wl',
'key' => $ip
);
return $this->http_post($data);
}
/**
* 4.7b - Blacklist IPs
* You can add an IP address to your blacklist.
*/
public function ban($ip)
{
$data = array(
'a' => 'ban',
'key' => $ip
);
return $this->http_post($data);
}
/**
* 4.7c - Unlist IPs
* You can remove an IP address from the whitelist and the blacklist.
*/
public function nul($ip)
{
$data = array(
'a' => 'nul',
'key' => $ip
);
return $this->http_post($data);
}
/**
* GLOBAL API CALL
* HTTP POST a specific task with the supplied data
*/
private function http_post($data, $type = 'USER')
{
switch ($type) {
case 'USER':
$data['u'] = $this->email;
$data['tkn'] = $this->token_key;
break;
case 'HOST':
$data['host_key'] = $this->host_key;
break;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
curl_setopt($ch, CURLOPT_URL, self::$URL[$type]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_TIMEOUT, self::TIMEOUT);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$http_result = curl_exec($ch);
$error = curl_error($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code != 200) {
return array(
'error' => $error
);
} else {
$result = json_decode($http_result);
echo $result->{'response'}->{'result'}->{'ip'}." - ".ucfirst($result->{'result'})."\n";
}
}
}
$valid = array();
// Check if the URL is set in the parameters at the top then retrieve and validate the contents
if (isset($url)) {
$url = get_data($url);
$comma = strpos($url, ",");
$space = strpos($url, " ");
$linebreak = strpos($url, "\n");
if ($comma !== false) {
$url = explode(",", $url);
echo "Comma detected\n";
} else if ($space !== false) {
$url = explode(" ", $url);
echo "Space detected\n";
} else if ($linebreak !== false) {
$url = explode("\n", $url);
echo "Line break detected\n";
} else {
echo "Can't detect delimiter, is it a space, comma or new line?\n";
}
if (is_array($url)) {
foreach ($url as $contents) {
if (filter_var($contents, FILTER_VALIDATE_IP)) {
array_push($valid, $contents);
} else {
echo $contents." is not valid.\n";
}
}
}
}
// Check if any IPs are set in the parameters and validate the contents
if (isset($ips)) {
if (is_array($ips)) {
foreach ($ips as $contents) {
if (filter_var($contents, FILTER_VALIDATE_IP)) {
array_push($valid, $contents);
} else {
echo $contents." is not valid.\n";
}
}
}
}
// What have we got?
echo count($valid)." IPs detected. ".$type."ing with Cloudflare now...\n";
// Set the listing types
$checkVars = array("Whitelist","Blacklist","Unlist");
// Check the listing type and get started
if(in_array($type, $checkVars)){
// Run the $url IPs first
if (isset($url)) {
if (is_array($url)) {
foreach ($url as $value) {
$cf = new cloudflare_api($cfemailaddress, $cfapikey);
if($type == "Whitelist") {
$response = $cf->wl($value);
} elseif($type == "Blacklist") {
$response = $cf->ban($value);
} elseif($type == "Unlist") {
$response = $cf->nul($value);
}
print_r($response);
}
}
} else {
echo "No URL specified, trying IPs\n";
}
// Run the $ips array second
if (isset($ips)) {
if (is_array($ips)) {
foreach ($ips as $value) {
$cf = new cloudflare_api($cfemailaddress, $cfapikey);
if($type == "Whitelist") {
$response = $cf->wl($value);
} elseif($type == "Blacklist") {
$response = $cf->ban($value);
} elseif($type == "Unlist") {
$response = $cf->nul($value);
}
print_r($response);
}
}
} else {
echo "No manual IPs specified\n";
}
} else {
echo "Unknown type, please check configuration\n";
}
// Fin
echo "Finished\n";
$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
echo "Script running time:".round($execution_time)." seconds\n";
@ravijo
Copy link

ravijo commented Aug 29, 2017

Thanks a lot for this tool. Is it possible to do the following as well:

  1. How to set access rules for a specific website?
  2. How to add a note to the access rule?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment