-Зверик- Опубликовано 23 Января 2007 Жалоба Поделиться Опубликовано 23 Января 2007 вишь Valera, уже некоторые отпали)))) А чем 'обычный' ( Продвинутый код безопасности 3.1 ) не устраивает? Роботы еще его долгое время не сломают)) Ссылка на комментарий Поделиться на других сайтах Прочее
Valera Опубликовано 24 Января 2007 Жалоба Поделиться Опубликовано 24 Января 2007 ---------а что на этом рисунке надо складывать то?)--------- не совсем складывать,там надо вычислить значение икс, т.е. 70-5^2-6^2 --------------Роботы еще его долгое время не сломают))--------------Я хочу блокировать не только ботов, но и школьников (которые например не умеют считать, что-то типа даун контроля). Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 24 Января 2007 Автор Жалоба Поделиться Опубликовано 24 Января 2007 а, как я уже неоднократно говорил, предложи разложить экспоненту в степени икс по формуле Тэйлора.. или синус, или косинус по этим формулам) Ссылка на комментарий Поделиться на других сайтах Прочее
Valera Опубликовано 24 Января 2007 Жалоба Поделиться Опубликовано 24 Января 2007 а, как я уже неоднократно говорил, предложи разложить экспоненту в степени икс по формуле Тэйлора.. или синус, или косинус по этим формулам)Это не подойдет, так как ДАЖЕ(!!!) не каждый выпускник вуза, спустя лет 5 и более вспомнит даже закон ома(который проходят по школьной программе). Для вычисления в уме (за определенный промежуток времени), имхо это не подходит... Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 24 Января 2007 Автор Жалоба Поделиться Опубликовано 24 Января 2007 я шучу)предложить посчитать вероятность того, что на трех монетах выпадут одновременно решки...в общем, много глупостей приходит в головусамое эффективное - пример, да еще и лишние цифры на картинке, чтоб бот их учитывал, а человек- нет Ссылка на комментарий Поделиться на других сайтах Прочее
Valera Опубликовано 24 Января 2007 Жалоба Поделиться Опубликовано 24 Января 2007 самое эффективное - пример, да еще и лишние цифры на картинке, чтоб бот их учитывал, а человек- нет Не-а, самое эффективное (от бота), это имхо, разрезание произвольной картинки на произвольные фрагменты, потом при помощи драг энд дропа надо картинку воссоздать... Картинки должны быть рандомными и переодически обновляться, разрезы тоже дожны быть рандомными (те срезы под различными углами). Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 24 Января 2007 Автор Жалоба Поделиться Опубликовано 24 Января 2007 тоесть он будет читать только одну картинку, а у нас будут несколько рядом? Ссылка на комментарий Поделиться на других сайтах Прочее
Valera Опубликовано 24 Января 2007 Жалоба Поделиться Опубликовано 24 Января 2007 Самая простая реализация подобного алгоритма,имеем некий каталог с картинками,скрипт рандомно открывает любой файл(картинку),делит ее, скажем, на 20 прямоугольных областей,данные области записывает в массив который "перемешивается" и выводит пользователю картинку с перемешанными областями,рядом с картинкой с перемешанными областями, есть пустая картинка,куда при помощи кликов с одной картинки на другую переносятся области по координатам клика...Если картинка не "собралась" или собралась не правильно, => выводится другая картинка, либо такой айпишник вносится во временный бан, например на сутки... и т.д. Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 24 Января 2007 Автор Жалоба Поделиться Опубликовано 24 Января 2007 ужос, пазл!!! Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 23 Февраля 2007 Автор Жалоба Поделиться Опубликовано 23 Февраля 2007 Только благодаря автору модаАктивация путём ответа на вопросыя прикрутил такие вопросы к регистрациив дальнейшем говорим спасибо Sannisсейчас в этой теме я постараюсь оформить инструкцию, а потом выложу в файловый архив Итак, начнем 1. Выполнить запросCREATE TABLE ibf_questions ( id mediumint(8) NOT NULL AUTO_INCREMENT, question text NOT NULL default '', answer text NOT NULL, PRIMARY KEY (id) ); 2. в папке sources/action_admin/ ДОБАВИТЬ файл следующего названия и содержания:questions.php<?php /* +-------------------------------------------------------------------------- | Invision Power Board 2.1.7 | ============================================= | by Matthew Mecham | (c) 2001 - 2005 Invision Power Services, Inc. | http://www.invisionpower.com | ============================================= | Web: http://www.invisionboard.com | http://www.ibresource.ru/products/invisionpowerboard/ | Time: Tuesday 06th of February 2007 06:30:41 PM | Release: ac9f31b6733e1bf5b59de50f412872a4 | Licence Info: http://www.invisionboard.com/?license | http://www.ibresource.ru/license +--------------------------------------------------------------------------- | INVISION POWER BOARD IS NOT FREE / OPEN SOURCE! +--------------------------------------------------------------------------- | INVISION POWER BOARD НЕ ЯВЛЯЕТСЯ БЕСПЛАТНЫМ ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ! | Права на ПО принадлежат Invision Power Services | Права на перевод IBResource (http://www.ibresource.ru) +--------------------------------------------------------------------------- | > $Date: 2005-10-10 14:08:54 +0100 (Mon, 10 Oct 2005) $ | > $Revision: 23 $ | > $Author: matt $ +--------------------------------------------------------------------------- | | > Help Control functions | > Module written by Matt Mecham | > Date started: 2nd April 2002 | | > Module Version Number: 1.0.0 | > DBA Checked: Mon 24th May 2004 +-------------------------------------------------------------------------- | Questions Mod v1.0 | ============================================= | > $Date: 2007-02-21 20:00 +0300 (Wed, 21 Feb 2007) $ | > $Author: Sannis (http://sannis.ru) , altered by Arhar $ +--------------------------------------------------------------------------- */ if ( ! defined( 'IN_ACP' ) ) { print "<h1>Неверный вход</h1> У Вас нет доступа к директиве этого файла. Если Вы проводили обновления, убедитесь, что не забыли обновить 'admin.php'."; exit(); } class ad_questions { function auto_run() { //----------------------------------------- // Kill globals - globals bad, Homer good. //----------------------------------------- $tmp_in = array_merge( $_GET, $_POST, $_COOKIE ); foreach ( $tmp_in as $k => $v ) { unset($$k); } //----------------------------------------- switch($this->ipsclass->input['code']) { case 'edit': $this->show_form('edit'); break; case 'new': $this->show_form('new'); break; case 'doedit': $this->doedit(); break; case 'donew': $this->doadd(); break; case 'remove': $this->remove(); break; //----------------------------------------- default: $this->list_files(); break; } } //----------------------------------------- // Questions FUNCTIONS //----------------------------------------- function doedit() { if ($this->ipsclass->input['id'] == "") { $this->ipsclass->admin->error("Вы должны ввести правильный ID вопроса!"); } $question = preg_replace( "/\n/", "<br>", stripslashes($_POST['question'] ) ); $answer = preg_replace( "/\n/", "<br>", stripslashes($_POST['answer'] ) ); $text = preg_replace( "/\\\/", "& #092;", $text ); $this->ipsclass->DB->do_update( 'questions', array( 'question' => $question, 'answer' => $answer, ), "id=".intval($this->ipsclass->input['id']) ); $this->ipsclass->admin->save_log("Изменен вопрос для модуля Questions"); $this->ipsclass->boink_it($this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}"); exit(); } //===================================================== function show_form($type='new') { $this->ipsclass->admin->page_detail = "В этой секции вы можете добавлять, изменять и удалять вопросы для модуля Questions."; $this->ipsclass->admin->page_title = "Управление вопросами для активации"; //----------------------------------------- if ($type != 'new') { if ($this->ipsclass->input['id'] == "") { $this->ipsclass->admin->error("Вы должны ввести правильный ID вопроса!"); } //----------------------------------------- $this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'questions', 'where' => "id=".intval($this->ipsclass->input['id']) ) ); $this->ipsclass->DB->simple_exec(); if ( ! $r = $this->ipsclass->DB->fetch_row() ) { $this->ipsclass->admin->error("Невозможно найти в базе данных вопрос с таким ID"); } //----------------------------------------- $button = 'Изменить этот вопрос'; $code = 'doedit'; } else { $r = array(); $button = 'Добавить этот вопрос'; $code = 'donew'; } $this->ipsclass->html .= $this->ipsclass->adskin->start_form( array( 1 => array( 'code' , $code ), 2 => array( 'act' , 'questions' ), 3 => array( 'id' , $this->ipsclass->input['id'] ), 4 => array( 'section', $this->ipsclass->section_code ), ) ); $this->ipsclass->adskin->td_header[] = array( " " , "20%" ); $this->ipsclass->adskin->td_header[] = array( " " , "80%" ); $r['question'] = preg_replace( "/<br>/i", "\n", stripslashes($r['question']) ); //----------------------------------------- $this->ipsclass->html .= $this->ipsclass->adskin->start_table( $button ); $this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( "Вопрос", $this->ipsclass->adskin->form_textarea('question', stripslashes($r['question']) ), ) ); $this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( "Ответ", $this->ipsclass->adskin->form_input('answer' , stripslashes($r['answer']) ), ) ); $this->ipsclass->html .= $this->ipsclass->adskin->end_form($button); $this->ipsclass->html .= $this->ipsclass->adskin->end_table(); $this->ipsclass->admin->output(); } //===================================================== function remove() { if ($this->ipsclass->input['id'] == "") { $this->ipsclass->admin->error("Вы должны ввести правильный ID вопроса!"); } $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'questions', 'where' => "id=".$this->ipsclass->input['id'] ) ); $this->ipsclass->admin->save_log("Удалён вопрос для модуля Questions"); $this->ipsclass->boink_it($this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}"); exit(); } //===================================================== function doadd() { if (($this->ipsclass->input['question'] == "") || ($this->ipsclass->input['answer'] == "")) { $this->ipsclass->admin->error("Вы должны ввести вопрос и ответ!"); } $question = preg_replace( "/\n/", "<br>", stripslashes($_POST['question'] ) ); $answer = preg_replace( "/\n/", "<br>", stripslashes($_POST['answer'] ) ); $question = preg_replace( "/\\\/", "& #092;", $question ); $answer = preg_replace( "/\\\/", "& #092;", $answer ); $this->ipsclass->DB->do_insert( 'questions', array( 'question' => $question, 'answer' => $answer, ) ); $this->ipsclass->admin->save_log("Добавлен вопрос для модуля Questions"); $this->ipsclass->boink_it($this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}"); exit(); } //===================================================== function list_files() { $this->ipsclass->admin->page_detail = "В этой секции вы можете добавлять, изменять и удалять вопросы для модуля Questions"; $this->ipsclass->admin->page_title = "Управление вопросами для модуля Questions"; //----------------------------------------- $this->ipsclass->adskin->td_header[] = array( "Вопрос" , "50%" ); $this->ipsclass->adskin->td_header[] = array( "Ответ" , "20%" ); $this->ipsclass->adskin->td_header[] = array( "Изменить" , "15%" ); $this->ipsclass->adskin->td_header[] = array( "Удалить" , "15%" ); //----------------------------------------- $this->ipsclass->html .= $this->ipsclass->adskin->start_table( "Текущие вопросы" ); $this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'questions', 'order' => "id" ) ); $this->ipsclass->DB->simple_exec(); if ( $this->ipsclass->DB->get_num_rows() ) { while ( $r = $this->ipsclass->DB->fetch_row() ) { $this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( stripslashes($r['question']),//"<b>".stripslashes($r['question'])."</b>"), stripslashes($r['answer']), "<center><a href='".$this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}& amp;code=edit& amp;id={$r['id']}'>Изменить</a></center>", "<center><a href='".$this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}& amp;code=remove& amp;id={$r['id']}'>Удалить</a></center>", ) ); } } $this->ipsclass->html .= $this->ipsclass->adskin->add_td_basic("<a href='".$this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}& amp;code=new'>Добавить новый вопрос</a>", "center", "pformstrip" ); $this->ipsclass->html .= $this->ipsclass->adskin->end_table(); //----------------------------------------- $this->ipsclass->admin->output(); } } ?>найти три раза & #092; и написать слитнонайти 11 раз & amp; и написать слитно 3. изменение файла /sources/acp_loaders/acp_admin.phpнайти 'components'=> 'components', 'acpperms' => 'acppermissions', 'security' => 'security',добавить после: 'questions' => 'questions', 4. изменение файла /sources/acp_loaders/acp_pages_admin.phpнайти 6 => array( 'Журнал предупреждений' , 'section=admin& amp;act=warnlog' ), );добавить после$CATS[] = array( 'Модуль вопросов' ); $PAGES[] = array( 1 => array( 'Вопросы при регистрации' , 'section=admin& amp;act=questions' ), );опять таки & amp; пишется слитно 5. идем в настройки - настройки безопасности и добавляем следующую настройку:Название настройки: Правильные ответы Описание настройки: Количество правильных ответов, необходимых для успешного завершения регистрации Группа настройки: Настройки Безопасности Тип настройки: Ввод текста (одна строка) Ключ настройки: questions_num Текущее значение настройки: 1 Значение настройки по умолчанию? 0 Начать группу настроек: Модуль вопросов Закончить группу настроек? Да Добавить эту настройку в кеш настроек? Дане указанные поля изменять не надо 6. изменение файла cache/lange_cache/*/lang_register.phpнайти$lang = array (добавить после//antispam.question 'err_reg_question' => "Не дано достаточное количество правильных ответов на защитные вопросы. Повторите попытку.", 7. идем во внешний вид - изменить html фрагменты - skin_register - ShowFormищем<!--{REQUIRED.FIELDS}-->добавляем после<fieldset class="row3"> <legend><b>Защитные вопросы</b></legend> <!--{ANTISPAM.QUESTION}--> </fieldset> 8. создаем в skin_register новый фрагментимя - question_rowвходящие переменные - $rowсодержание - <tr> <td width="80%">{$row['question']}</td> <td width="20%" align="center">{$row['answer_input']}</td> </tr> 9. ну и наконец sources/action_public/register.phpнайти var $modules = "";добавить после //antispam.question var $prefix = "answer_";найти //----------------------------------------- // Replace elements //-----------------------------------------добавить после //antispam.question $question_row .= "<table class='ipbtable' cellspacing=\"0\"> <tr> <td width=\"100%\" colspan=\"2\">Для успешной регистрации необходимо ответить на ".$this->ipsclass->vars['questions_num']." вопрос(ов)</td> </tr> "; $this->ipsclass->DB->simple_construct( array( 'select' => 'id, question', 'from' => 'questions', 'order' => 'id' ) ); $this->ipsclass->DB->simple_exec(); while ($row = $this->ipsclass->DB->fetch_row() ) { $row['answer_input'] = "<input type=\"text\" maxlength=\"60\" size=\"30\" name=\"".$this->prefix.$row['id']."\" />"; $question_row .= $this->ipsclass->compiled_templates['skin_register']->question_row( $row ); } $question_row .="</table>"; $this->output = str_replace( "<!--{ANTISPAM.QUESTION}-->", $question_row , $this->output ); //antispam.questionнайти //----------------------------------------- // CHECK 2: Any errors (duplicate names, etc)? //----------------------------------------- if ( count( $form_errors ) ) { $this->show_reg_form( $form_errors ); return; }добавить ПЕРЕД //antispam.question $n = $this->num_correct(); if(!$this->correct_answer($n)) { $form_errors['general'][] = $this->ipsclass->lang['err_reg_question']; } //antispam.questionнайти} ?>добавить ПЕРЕД /*-------------------------------------------------------------------------*/ // Calculate correct answers /*-------------------------------------------------------------------------*/ function num_correct() { $this->ipsclass->DB->simple_construct( array( 'select' => 'id, answer', 'from' => 'questions', 'order' => 'id' ) ); $this->ipsclass->DB->simple_exec(); $n = 0; while ($row = $this->ipsclass->DB->fetch_row() ) { $s = $this->prefix.$row['id']; if(isset($this->ipsclass->input[$s]) && $this->ipsclass->input[$s] == $row['answer']) { $n++; } } return $n; } /*-------------------------------------------------------------------------*/ // Correct? /*-------------------------------------------------------------------------*/ function correct_answer($n) { if($n >= $this->ipsclass->vars['questions_num']) return true; else return false; } усе..работаетв моды для успешной работы необходимо придумать хотя бы один вопрос и ответ на него Ссылка на комментарий Поделиться на других сайтах Прочее
Sannis Опубликовано 23 Февраля 2007 Жалоба Поделиться Опубликовано 23 Февраля 2007 Offtopic: Даже и не думал о таком применении) Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 24 Февраля 2007 Жалоба Поделиться Опубликовано 24 Февраля 2007 надо создать топик "Защита от ботов" и выложить туда ссылки на все нестандартные решения. И самое главное - закрыть его.Думаю такой топик будет пользоваться популярностью. Ссылка на комментарий Поделиться на других сайтах Прочее
Alquis Опубликовано 25 Февраля 2007 Жалоба Поделиться Опубликовано 25 Февраля 2007 да вообще както неактивно ))) 20 Баков не лишние а проблема не решаетсо Ссылка на комментарий Поделиться на других сайтах Прочее
fluoro Опубликовано 5 Марта 2007 Жалоба Поделиться Опубликовано 5 Марта 2007 вот интересное решение http://www.codenet.ru/webmast/php/AntiSPAM-Captcha.php Ссылка на комментарий Поделиться на других сайтах Прочее
Garret Опубликовано 5 Марта 2007 Жалоба Поделиться Опубликовано 5 Марта 2007 Такая штука уже давно была реализована на одном из забугорных сайтов, на каком не помню. Ссылка на комментарий Поделиться на других сайтах Прочее
fluoro Опубликовано 5 Марта 2007 Жалоба Поделиться Опубликовано 5 Марта 2007 такую штуку реально для IPB сделать? Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 5 Марта 2007 Автор Жалоба Поделиться Опубликовано 5 Марта 2007 возможно все, но на данный момент не актуально Ссылка на комментарий Поделиться на других сайтах Прочее
draniy Опубликовано 6 Марта 2007 Жалоба Поделиться Опубликовано 6 Марта 2007 у меня решилась проблема с ботами после того как я сделал доп. поля с обязательным заполнением при регистрации... Ссылка на комментарий Поделиться на других сайтах Прочее
DANMASTER Опубликовано 28 Апреля 2007 Жалоба Поделиться Опубликовано 28 Апреля 2007 Кстати на самом деле.. Ввёл поле имя и сделал нестандартное имя с обязательным заполнением поля.. Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 1 Мая 2007 Автор Жалоба Поделиться Опубликовано 1 Мая 2007 а нифигабот не заполняет стандартные поля, он заполняет все, что есть в форме под тегом inputну естесственно продвинутый бот... Ссылка на комментарий Поделиться на других сайтах Прочее
atlant1s Опубликовано 9 Июня 2007 Жалоба Поделиться Опубликовано 9 Июня 2007 Топ умер?Если данная дискуссия ещё актуальная - могу предложить один эффективный вариант решения проблемы с ботами. Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 9 Июня 2007 Автор Жалоба Поделиться Опубликовано 9 Июня 2007 почему умер?Защита от ботов: вопросы при регистрации v3+Анти-спам модификацииможет уже было предложено? Ссылка на комментарий Поделиться на других сайтах Прочее
atlant1s Опубликовано 9 Июня 2007 Жалоба Поделиться Опубликовано 9 Июня 2007 Тут вы обсуждали всевозможные методы по борьбе с ботами. Вот у меня возникла идея системы, которая остановит ботов ещё на лет 10 Вот накидал макет в delphihttp://img247.imageshack.us/img247/7531/activationsn5.jpg Значит так, по пунктам: Юзер загружает текстовикСкрипт проверяет если размер текстовика = 0 байт - значит шаг пройден. Логин через +Можно в принципе выбрать любой другой знак, мне этот понравился Можно узнать длину логина (lenght), присвоить переменной N (допустим) количество символов в логине, через for заполнить "+" после каждой буквы N-1 раз. Цифры в обратном порядкеЯ предлагаю сделать 3 массива. 1 массив "A" генерирует случайное число и выводится юзеру для обработки. К массиву "B" присваиваем значения (числа) массив "А", массив "B" переворачиваем, для сравнения конечного результата. Юзер заполняет форму (массив "С"), в результате сравниваем массив "С" (вариант юзер) и массив "B" (вариант скрипта). Числа, которые делятся на 2Ну это думаю ход моих мыслей объяснять не нужно КартинкаНа сей алгоритм картинки натолкнула модификация Продвинутый код безопасности 3.1 , за что автору отдельное спасибо. Перенос строки из одной формы в другуюВыводится одна строка, которая либо одна, либо выбирается из списка, который можно сделать в админке. Дальше юзер переносит строку в форму2 с формы1. Проверка:Сравниваем значение формы2 с строкой, которая была дана юзеру (можно сравнивать по MD5 коды), или по другому. Кому как угодно. И проверяем пуста ли форма1 (if length = 0). Дата рожденияТут думаю тоже объяснять ничего не нужно. Обычный вопрос к юзеру Естественно, правильное значение 1 из 3. Вопросы и ответы можно использовать одни, либо задавать через админцентр, то есть каждый раз новые вопросы и ответы. Перетаскивание бегункаУстанавливаем минимальное и максимальное значение, раз у нас проценты - значит:min := 0;max := 100;Здесь думаю желаемую позицию (я выбрал 54%) можно оставить единственной, а вот позицию бегунка можно сделать случайной. И в конце сравниваем позиции.Как мне кажется, если сделать такую систему - это на долго остановит ботов. Очень на долго.Реализация, как мне кажется, не простая. Сам бы написал, если бы знал php так, как знаю delphi Но не судьба мне быть автором сего творения. Жду мнений. Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 9 Июня 2007 Автор Жалоба Поделиться Опубликовано 9 Июня 2007 а также она остановит пользователей)) навсегда)))шучу9 пункт наверно отпадает сразу, ибо я в html не знаю бегунки есть ли вообще1 ячейка - отпугнет юзеров 100% ибо у меня 7/8 даже не знают, что такое ксс и зачем надо в настройках выбрать "кешировать ксс"остальное так или иначе реализовано (или легко реализуемо на основе имеющегося, например 3,4,6 - через вопросы (4 с небольшим изменением), 2,7,8 - я видел такие запросы, достаточно всего 5 строчек кода в регистер пхп для реализации каждого, 5 - капча Гаррета), достаточно всего-лишь установить это все сразу Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 9 Июня 2007 Жалоба Поделиться Опубликовано 9 Июня 2007 Жду мнений. Зачем такие сложности?У меня во всех разделах разрешено писать и создавать темы гостям; никаких цифр или плюсиков для идентификации вводить не надо: написал и жми кнопку "отправить".Элементарная проверка джава-скриптом, нажимались ли клавиши клавиатуры и щелкалась ли мышкой - боты этого делать не умеют и не будут уметь делать.Детали описывать не буду: пока алгоритм уникальный, ботописателям нет смысла взламывать мой алгоритм ради одного форума.Пишите свой алгоритм, это не сложно, и ставьте на свой форум. И можно забыть о ботах, и не создавать нормальным посетителям лишней головной боли. Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения