Меню
Главная
Форумы
Новые сообщения
Что нового?
Новые сообщения
Вход
Регистрация
Что нового?
Новые сообщения
Меню
Вход
Регистрация
Соцсети заблокировали! Простой способ обхода блокировки Twitter и Facebook
здесь
-----
Форум блокируют за
антивоенную статью
-----
В связи с преследованиями за инакомыслие, теперь можно
анонимно
отвечать в темах.
-----
Обновлен
скрипт для определения IP госорганов
-----
Наш реестр запрещенных сайтов
с широким функционалом.
Создаем свой генератор зеркал
для обхода блокировки.
Главная
Форумы
Противодействие интернет-цензуре
Препятствуем блокировке сайта
Роскомсос - скрипт для определения IP госорганов
JavaScript отключён. Чтобы полноценно использовать наш сайт, включите JavaScript в своём браузере.
Ответить в теме
Сообщение
<p>[QUOTE="Master, post: 1940, member: 10"]</p><p><strong><strong>update 11.12.2016</strong></strong></p><p>Список IP госорганов обновлен.</p><p>Обновлены скрипты.</p><p>Появился скрипт для тестирования (test.php, пример <a href="https://roscenzura.com/roscomsos.php">здесь</a>).</p><p>Добавлена админка для кодировки windows-1251 (файл в архиве admin_win1251.php).</p><p></p><p><strong>update 07.10.2016</strong></p><p>Скрипт и список IP госорганов обновлены.</p><p>Появилась <a href="https://roscenzura.com/threads/713/page-3#post-4350">админка</a>.</p><p></p><p>------</p><p></p><p>Подобный скрипт <a href="https://roscenzura.com/threads/296/">уже существует</a> - <a href="https://antizapret.info/services.php">Котозапрет</a> от Antizapret.info. Их скрипт проверяет IP по диапазонам <a href="https://roscenzura.com/threads/102/">ip-адресов госорганов</a> и выводит фотографию котика, если вхождение найдено. Но Котозапрет нам показался не оптимальным, поэтому мы решили сделать собственный.</p><p></p><p><strong>Что же не так в Котозапрете?</strong></p><p>Во-первых, мало ip-адресов - у нас получилось на порядок больше. Во-вторых, алгоритм не оптимальный, что может тормозить работу посещаемых сайтов. И в-третьих, сомнительное решение повысить производительность скрипта за счет кэширования госоргановских IP.</p><p>[PHP]</p><p> /*</p><p> * @brief производится загрузка базы и запись ip адреса блокируемого при включеном файловом кэшировании (с целью снижения нагрузки на разбор массива, так как is_file быстрее)</p><p> *</p><p> */</p><p> public function parseBase($ip, $store = 0) {</p><p> $networks = explode("::", file_get_contents($this->cache_path . "/" . $this->cache_file));</p><p> foreach ($networks AS $network) {</p><p> if (self::match($network, $ip)) {</p><p> if ($store)</p><p> file_put_contents($this->cache_path . "/" . $ip, "");</p><p> self::goBlock();</p><p> }</p><p> }</p><p> }</p><p>[/PHP]</p><p>Может есть смысл заносить в лог госоргановские IP, чтобы понимать, какие органы проверяют сайт, но кэшировать с целью снижения нагрузки - сомнительная затея, ведь мы ориентированы на пользователей, а не на госорганы, зачем для них нам нагрузку снижать.</p><p></p><p>Непонятно также почему частота обновления файла с данными выставлена в 30 минут, когда списки диапазонов обновляются раз в паятилетку. Мы выставили примерно в 5 дней, но можно и реже.</p><p></p><p><strong>Скрипт Роскомсос.</strong></p><p>Скрипт реализован в виде класса Roscomsos, который только определяет принадлежность IP к госорганам. В случае попадания можете показывать котиков или <a href="https://roscenzura.com/upload/img/grey.jpg">Сашу Грей</a>, а лучше отдать измененный, незапрещенный контент. Например, если у вас <a href="https://roscenzura.com/threads/632/">киносайт</a>, то госорганам вы можете показывать трейлеры фильмов, а остальным пользователям фильмы целиком.</p><p></p><p>В целях повышения производительности скрипт использует два файла: в одном файле собраны только первые два байта госовских айпи, а в другом полный список всех известных диапазонов. Проверка осуществляется в три этапа: сначала ищем совпадение двух байтов IP в первом файле (большинство пользователей отфильтруется уже на этом этапе, что снизит нагрузку на сервер), затем, если IP похож на госовский, то ищем первые три байта в полном списке, далее, если совпадений не найдено, IP ищется в диапазонах, но не во всех, а только с такими же первыми двумя байтами.</p><p></p><p><strong>Сам класс:</strong></p><p>[PHP]</p><p><?PHP</p><p></p><p>class Roscomsos {</p><p></p><p> public $time_update='5'; // Обновляем список каждые 5 дней, можно поставить и 10 и 30</p><p> // public $url_update='https://roscenzura.com/roscomsos/'; // Если урл не указан, то обновление данных не происходит</p><p> public $file_ip='gosip.data'; // Полный массив данных</p><p> public $file_short='gosip_short.data'; // Сокращенный массив данных с первыми двумя байтами госовских IP для предварительной проверки</p><p> public $file_log='gosiplog.txt'; // Закомментируйте, если не хотите логировать IP госорганов</p><p> public $d; // директория скрипта</p><p> public $ip;</p><p></p><p> public function __construct()</p><p> {</p><p> $this->d = $_SERVER['DOCUMENT_ROOT'].'/roscomsos/'; // не забудьте назначить права 0777 на папку</p><p> }</p><p></p><p> public function update_data()</p><p> {</p><p> $file=$this->d.$this->file_ip;</p><p></p><p> if ($this->url_update=='') return;</p><p></p><p> if (!is_file($file) or (filemtime($file)+ $this->time_update * 24 * 3600 < time()) )</p><p> {</p><p> file_put_contents($file, file_get_contents($this->url_update.$this->file_ip));</p><p> file_put_contents($this->d.$this->file_short, file_get_contents($this->url_update.$this->file_short));</p><p></p><p> if (!is_file($file)) die('Установите права для записи на папку ' . $this->d);</p><p> }</p><p> }</p><p></p><p> // Ищем IP в диапазоне, например, таком 155.39.133.161-155.39.133.174</p><p> public function find_range($range)</p><p> {</p><p> $range=explode('-', $range);</p><p> if (!isset($range[1])) return false;</p><p></p><p> return ( ip2long($this->ip)>=ip2long($range[0]) && ip2long($this->ip)<=ip2long($range[1]) );</p><p> }</p><p></p><p> // Ищем IP в подсети, например, 151.224.182.0/23</p><p> public function find_subnet($range)</p><p> {</p><p> list ($subnet, $bits) = explode('/', $range);</p><p></p><p> $ip = ip2long($this->ip);</p><p> $subnet = ip2long($subnet);</p><p></p><p> $mask = -1 << (32 - $bits);</p><p> $subnet &= $mask;</p><p></p><p> return ($ip & $mask) == $subnet;</p><p> }</p><p></p><p> // Проверяем IP в три этапа</p><p> public function check_ip($ip=false, $log=true)</p><p> {</p><p> if ($ip) $this->ip=$ip;</p><p></p><p> if ($this->ip != long2ip(ip2long($this->ip))) return; // Если IP6, отметаем</p><p></p><p> if (!is_file($this->d.$this->file_short)) $this->update_data(); else if( date("d") % $this->time_update == 0) $this->update_data(); // Если файл данных не найден или давно не обновлялся - обновляем</p><p></p><p></p><p> $bytes=explode('.', $this->ip);</p><p></p><p> // var_dump(file_get_contents($this->d.$this->file_short));</p><p></p><p> if (strpos(file_get_contents($this->d.$this->file_short), '|'.$bytes[0].'.'.$bytes[1].'|' )===false) return false; // Ищем первые два байта в первом списке, большинство негосовских IP отфильтруется здесь</p><p></p><p></p><p> $file=file_get_contents($this->d.$this->file_ip);</p><p> </p><p> if (strpos($file, '|'.$bytes[0].'.'.$bytes[1].'.'.$bytes[2].'.')!==false) return $this->logGosIp($log); // Жесткий режим блокировки: если три байта совпадают, блокировать</p><p></p><p></p><p> $find_m='||'.$bytes[0].'.'.$bytes[1].'||';</p><p></p><p> // Берем диапазон только с такими же первыми двумя байтами, чтобы не прогонять по всему списку</p><p> $file=substr($file, strpos($file, $find_m)+strlen($find_m) );</p><p> $file=substr($file, 0, strpos($file, '||') );</p><p></p><p> // Проверяем вхождение IP в диапазоны</p><p> $ip_c=explode('|', $file); $check=false;</p><p> foreach ($ip_c as $i=>$gip)</p><p> {</p><p> if (strpos($gip, '/')) $check=$this->find_subnet($gip); else $check=$this->find_range($gip);</p><p></p><p> if ($check==true) return $this->logGosIp($log);</p><p></p><p> }</p><p> }</p><p></p><p> // Сохраняем IP госорганов</p><p> public function logGosIp($log=false)</p><p> {</p><p> if ($log) file_put_contents($this->d.$this->file_log, $this->ip.chr(13).chr(10), FILE_APPEND);</p><p></p><p> return true;</p><p> }</p><p></p><p>}</p><p>?></p><p>[/PHP]</p><p></p><p>Этот код нужно вставить на сайте (в файл index.php).</p><p>[PHP]</p><p>require_once($_SERVER['DOCUMENT_ROOT']."/roscomsos/roscomsos.php");</p><p></p><p>$Roscomsos=new Roscomsos();</p><p>$check_gos_ip=$Roscomsos->check_ip($_SERVER['REMOTE_ADDR']); // Если true, то IP вероятно принадлежит диапазону адресов госорганов</p><p></p><p>if ($check_gos_ip)</p><p>{</p><p> echo 'Доступ на сайт запрещен';</p><p>}</p><p>[/PHP]</p><p></p><p><span style="color: #b30000">Не забудьте установить права на запись для следующих файлов: gosip.data, gosip_short.data, gosiplog.txt</span>.</p><p></p><p>Файл с актуальными диапазонами IP госорганов и Роскомнадзора теперь находится по ссылке: <a href="https://roscenzura.com/roscomsos/gosip.txt">https://roscenzura.com/roscomsos/gosip.txt</a>.</p><p>Для получения дополнительной информации пишите нам в ЛС.</p><p></p><p>Ссылка на скачивание скрипта: <a href="https://roscenzura.com/roscomsos/roscomsos.zip">https://roscenzura.com/roscomsos/roscomsos.zip</a></p><p>Тестирование: <a href="https://roscenzura.com/roscomsos.php">https://roscenzura.com/roscomsos.php</a></p><p>[/QUOTE]</p>
[QUOTE="Master, post: 1940, member: 10"] [B][B]update 11.12.2016[/B][/B] Список IP госорганов обновлен. Обновлены скрипты. Появился скрипт для тестирования (test.php, пример [URL='https://roscenzura.com/roscomsos.php']здесь[/URL]). Добавлена админка для кодировки windows-1251 (файл в архиве admin_win1251.php). [B]update 07.10.2016[/B] Скрипт и список IP госорганов обновлены. Появилась [URL='https://roscenzura.com/threads/713/page-3#post-4350']админка[/URL]. ------ Подобный скрипт [URL='https://roscenzura.com/threads/296/']уже существует[/URL] - [URL='https://antizapret.info/services.php']Котозапрет[/URL] от Antizapret.info. Их скрипт проверяет IP по диапазонам [URL='https://roscenzura.com/threads/102/']ip-адресов госорганов[/URL] и выводит фотографию котика, если вхождение найдено. Но Котозапрет нам показался не оптимальным, поэтому мы решили сделать собственный. [B]Что же не так в Котозапрете?[/B] Во-первых, мало ip-адресов - у нас получилось на порядок больше. Во-вторых, алгоритм не оптимальный, что может тормозить работу посещаемых сайтов. И в-третьих, сомнительное решение повысить производительность скрипта за счет кэширования госоргановских IP. [PHP] /* * @brief производится загрузка базы и запись ip адреса блокируемого при включеном файловом кэшировании (с целью снижения нагрузки на разбор массива, так как is_file быстрее) * */ public function parseBase($ip, $store = 0) { $networks = explode("::", file_get_contents($this->cache_path . "/" . $this->cache_file)); foreach ($networks AS $network) { if (self::match($network, $ip)) { if ($store) file_put_contents($this->cache_path . "/" . $ip, ""); self::goBlock(); } } } [/PHP] Может есть смысл заносить в лог госоргановские IP, чтобы понимать, какие органы проверяют сайт, но кэшировать с целью снижения нагрузки - сомнительная затея, ведь мы ориентированы на пользователей, а не на госорганы, зачем для них нам нагрузку снижать. Непонятно также почему частота обновления файла с данными выставлена в 30 минут, когда списки диапазонов обновляются раз в паятилетку. Мы выставили примерно в 5 дней, но можно и реже. [B]Скрипт Роскомсос.[/B] Скрипт реализован в виде класса Roscomsos, который только определяет принадлежность IP к госорганам. В случае попадания можете показывать котиков или [URL='https://roscenzura.com/upload/img/grey.jpg']Сашу Грей[/URL], а лучше отдать измененный, незапрещенный контент. Например, если у вас [URL='https://roscenzura.com/threads/632/']киносайт[/URL], то госорганам вы можете показывать трейлеры фильмов, а остальным пользователям фильмы целиком. В целях повышения производительности скрипт использует два файла: в одном файле собраны только первые два байта госовских айпи, а в другом полный список всех известных диапазонов. Проверка осуществляется в три этапа: сначала ищем совпадение двух байтов IP в первом файле (большинство пользователей отфильтруется уже на этом этапе, что снизит нагрузку на сервер), затем, если IP похож на госовский, то ищем первые три байта в полном списке, далее, если совпадений не найдено, IP ищется в диапазонах, но не во всех, а только с такими же первыми двумя байтами. [B]Сам класс:[/B] [PHP] <?PHP class Roscomsos { public $time_update='5'; // Обновляем список каждые 5 дней, можно поставить и 10 и 30 // public $url_update='https://roscenzura.com/roscomsos/'; // Если урл не указан, то обновление данных не происходит public $file_ip='gosip.data'; // Полный массив данных public $file_short='gosip_short.data'; // Сокращенный массив данных с первыми двумя байтами госовских IP для предварительной проверки public $file_log='gosiplog.txt'; // Закомментируйте, если не хотите логировать IP госорганов public $d; // директория скрипта public $ip; public function __construct() { $this->d = $_SERVER['DOCUMENT_ROOT'].'/roscomsos/'; // не забудьте назначить права 0777 на папку } public function update_data() { $file=$this->d.$this->file_ip; if ($this->url_update=='') return; if (!is_file($file) or (filemtime($file)+ $this->time_update * 24 * 3600 < time()) ) { file_put_contents($file, file_get_contents($this->url_update.$this->file_ip)); file_put_contents($this->d.$this->file_short, file_get_contents($this->url_update.$this->file_short)); if (!is_file($file)) die('Установите права для записи на папку ' . $this->d); } } // Ищем IP в диапазоне, например, таком 155.39.133.161-155.39.133.174 public function find_range($range) { $range=explode('-', $range); if (!isset($range[1])) return false; return ( ip2long($this->ip)>=ip2long($range[0]) && ip2long($this->ip)<=ip2long($range[1]) ); } // Ищем IP в подсети, например, 151.224.182.0/23 public function find_subnet($range) { list ($subnet, $bits) = explode('/', $range); $ip = ip2long($this->ip); $subnet = ip2long($subnet); $mask = -1 << (32 - $bits); $subnet &= $mask; return ($ip & $mask) == $subnet; } // Проверяем IP в три этапа public function check_ip($ip=false, $log=true) { if ($ip) $this->ip=$ip; if ($this->ip != long2ip(ip2long($this->ip))) return; // Если IP6, отметаем if (!is_file($this->d.$this->file_short)) $this->update_data(); else if( date("d") % $this->time_update == 0) $this->update_data(); // Если файл данных не найден или давно не обновлялся - обновляем $bytes=explode('.', $this->ip); // var_dump(file_get_contents($this->d.$this->file_short)); if (strpos(file_get_contents($this->d.$this->file_short), '|'.$bytes[0].'.'.$bytes[1].'|' )===false) return false; // Ищем первые два байта в первом списке, большинство негосовских IP отфильтруется здесь $file=file_get_contents($this->d.$this->file_ip); if (strpos($file, '|'.$bytes[0].'.'.$bytes[1].'.'.$bytes[2].'.')!==false) return $this->logGosIp($log); // Жесткий режим блокировки: если три байта совпадают, блокировать $find_m='||'.$bytes[0].'.'.$bytes[1].'||'; // Берем диапазон только с такими же первыми двумя байтами, чтобы не прогонять по всему списку $file=substr($file, strpos($file, $find_m)+strlen($find_m) ); $file=substr($file, 0, strpos($file, '||') ); // Проверяем вхождение IP в диапазоны $ip_c=explode('|', $file); $check=false; foreach ($ip_c as $i=>$gip) { if (strpos($gip, '/')) $check=$this->find_subnet($gip); else $check=$this->find_range($gip); if ($check==true) return $this->logGosIp($log); } } // Сохраняем IP госорганов public function logGosIp($log=false) { if ($log) file_put_contents($this->d.$this->file_log, $this->ip.chr(13).chr(10), FILE_APPEND); return true; } } ?> [/PHP] Этот код нужно вставить на сайте (в файл index.php). [PHP] require_once($_SERVER['DOCUMENT_ROOT']."/roscomsos/roscomsos.php"); $Roscomsos=new Roscomsos(); $check_gos_ip=$Roscomsos->check_ip($_SERVER['REMOTE_ADDR']); // Если true, то IP вероятно принадлежит диапазону адресов госорганов if ($check_gos_ip) { echo 'Доступ на сайт запрещен'; } [/PHP] [COLOR=#b30000]Не забудьте установить права на запись для следующих файлов: gosip.data, gosip_short.data, gosiplog.txt[/COLOR]. Файл с актуальными диапазонами IP госорганов и Роскомнадзора теперь находится по ссылке: [URL]https://roscenzura.com/roscomsos/gosip.txt[/URL]. Для получения дополнительной информации пишите нам в ЛС. Ссылка на скачивание скрипта: [URL]https://roscenzura.com/roscomsos/roscomsos.zip[/URL] Тестирование: [URL]https://roscenzura.com/roscomsos.php[/URL] [/QUOTE]
Предпросмотр
Имя
Проверка
Ответить
Главная
Форумы
Противодействие интернет-цензуре
Препятствуем блокировке сайта
Роскомсос - скрипт для определения IP госорганов
Сверху