web — PHP блокирует доступ к сайту по странам

Я хочу заблокировать доступ некоторых стран к моему веб-сайту из-за чрезмерного количества вредоносных обращений каждый день. Я нашел сценарий здесь http://azuliadesigns.com/blocking-website-access-country-php/ где я могу заблокировать доступ страны к веб-сайту. Это хорошо для начала. Но здесь я могу заблокировать только одну страну с if($two_letter_country_code=="US"),

скрипт

if ($_SERVER['HTTP_X_FORWARDED_FOR'])
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
else
$ip   = $_SERVER['REMOTE_ADDR'];

$two_letter_country_code=iptocountry($ip);

function iptocountry($ip)
{
$numbers = explode( ".", $ip);

include("ip_files/".$numbers[0].".php");
$code=($numbers[0] * 16777216) + ($numbers[1] * 65536) + ($numbers[2] * 256) + ($numbers[3]);

foreach($ranges as $key => $value)
{
if($key<=$code)
{
if($ranges[$key][0]>=$code)
{
$country=$ranges[$key][1];break;
}
}
}

if ($country=="")
{
$country="unknown";
}

return $country;
}
if ($two_letter_country_code=="US")
die();

У меня вопрос: что если я захочу заблокировать доступ к нескольким странам здесь из базы данных? Предположим, я сохранил некоторые коды стран в своей базе данных, чтобы заблокировать их, например, US, IN, PK …. и так далее, и я хочу заблокировать доступ ко всем этим. В таком случае, как я могу изменить этот скрипт для работы?

Что я думаю должно работать:

$country_codes_to_block = $row['block_countries']; // Fetched from database. This will give me the country codes US,IN,PK... etc.

Теперь модифицируем эту строку

if ($two_letter_country_code=="US")

в

if (in_array($two_letter_country_code, $country_codes_to_block))

Будет ли это блокировать доступ ко всем странам, чьи коды указаны в базе данных? Или я должен сделать что-то еще? И действительно ли этот скрипт полезен или есть какие-то недостатки, которые мне нужно преодолеть? Меня смущают эти вопросы. Пожалуйста, помогите мне…

1

Решение

if ($_SERVER['HTTP_X_FORWARDED_FOR'])
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
else
$ip   = $_SERVER['REMOTE_ADDR'];

$two_letter_country_code=iptocountry($ip);

function iptocountry($ip)
{
$numbers = explode( ".", $ip);

include("ip_files/".$numbers[0].".php");
$code=($numbers[0] * 16777216) + ($numbers[1] * 65536) + ($numbers[2] * 256) + ($numbers[3]);

foreach($ranges as $key => $value)
{
if($key<=$code)
{
if($ranges[$key][0]>=$code)
{
$country=$ranges[$key][1];break;
}
}

}if ($country=="")
{
$country="unknown";
}error_reporting(E_ERROR | E_PARSE);

include ("mysqli_connection_file.php");
$query = "SELECT column_name FROM table_name";
$result = mysqli_query($conn, $query);

if (!$conn) { die("No Connection was made"); }

while($row = mysqli_fetch_assoc($result)) {

$ccode = $row['name'];

}

foreach ($ranges as $key => $value) {
$countryset = $ranges[$key][1];
//echo $countryset."<br />";

if($ccode == $countryset) {
$time = date('Y-m-d H:i');
$insert = "INSERT IGNORE INTO logged_table VALUES ('','$ip','$time','IP Blocked','$countryset')";

if ($conn->query($insert) === TRUE) {} else {
echo "Error: " . $sql . "<br>" . $conn->error;
die;
}

mysqli_free_result($result);
mysqli_close($conn);echo "<script>alert('Please take a moment to review a very special offer we are running before you review!')</script>";
echo "<META http-equiv='refresh' content='0; URL=http://www.leapfrog.com'>";

}

}
}
0

Другие решения

По моему опыту, это должно работать с помощью in_array()

как насчет использования общего метода, как if ($two_letter_country_code=="US" || $two_letter_country_code=="UK" ) Работает?

-1

По вопросам рекламы [email protected]