Как я могу ограничить, какие страны могут просматривать мой сайт ( PHP)
Там простой способ сделать это в PHP. Я хочу убедиться, что только веб-запросы из определенных стран могут получить доступ к моему веб-сайту.
Есть идеи?
6 ответов
Используйте базу данных геолокации IP (некоторые бесплатны) и $_SERVER["REMOTE_ADDR"], чтобы получить IP-адрес посетителя.
http://www.maxmind.com/app/geolitecity - бесплатная (менее точная) коммерческая версия.
Как и Жиль, в прошлом я использовал для этого материал GeoIP от MaxMind, настроенный на расширение скорости PECL. Это работает достаточно хорошо, но...
Требование такого рода вещей обычно исходит от того, кто не понимает, что таким способом невозможно надежно определить местоположение посетителей. Очень важно, чтобы человека, просящего об этом, поощряли понимать, что это почти бесполезно. Типичная вещь, которая происходит с гео-местоположением в этом:
Клиент: я хочу иметь возможность ограничивать контент по IP
Dev: Вы знаете, что это невозможно сделать надежно?
Клиент: Ах да, но эта компания говорит, что они продадут мне то, что сделает это
Дев: Да, но он не точный, его легко обойти и он обычно указывает на плохую бизнес-модель для интернет-контента.
Клиент: Вы можете сделать это?
Dev: Что угодно...
... шесть месяцев спустя...
Клиент: Некоторые из моих посетителей жаловались, что не могут видеть мой контент, а некоторые плохие люди, которые не должны видеть его, смогли!
Dev: / мне пощечину
Оттуда только один шаг до "могу ли я сделать это так, чтобы, когда пользователь щелкает правой кнопкой мыши в своем браузере, появлялся маленький значок с надписью " эти изображения принадлежат Idiot Inc. " ?"
Извините, очевидно, в циничном настроении сегодня!
Оба ответа (геолокация, пользовательский агент) будут работать, но могут быть побеждены. Кто-то может использовать прокси-сервер или изменить свой пользовательский агент. Firefox даже имеет плагин для этой цели.
Если вы используете ответ Бена Доулинга и код не работает, попробуйте это:
if (!in_array(substr($country, 0, 2), $allowed_countries)) {
вместо:
if(!in_array($country, $allowed_countries)) {
Существуют определенные классы, которые могут определять локали пользовательского агента. Попробуйте что-нибудь подобное. Zend Framework имеет отличный класс для этого Zend_Locale