Реферат

Реферат Защита интернет сайтов и форумов

Работа добавлена на сайт bukvasha.net: 2015-10-28

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 9.11.2024



СОДЕРЖАНИЕ

  1. РЕФЕРАТ………………………………………………………………..….3

  2. ВВЕДЕНИЕ…………..………...…………………………………………..4

  3. 1 ПОСТАНОВКА ЗАДАЧИ…..……………..…………………………….5

  4. 2 ВЫБОР ТЕХНИЧЕСКИХ СРЕДСТВ И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ……………………………………………………………6

  5. 3 СТРУКТУРА БАЗЫ ДАННЫХ

3.1 Основы работы с СУБД MySQL………………………………………7

3.2 Стандартные функции PHP для работы с MySQL……………….......9

3.3 Дополнительные таблицы базы данных для защитного модуля…..12

6. 4 СТРУКТУРА ПРИЛОЖЕНИЯ

4.1 Основные функции создаваемого модуля…………………………..13

4.2 Установка модуля защиты……………………………………………14

7. 5 ОПИСАНИЕ ИНТЕРФЕЙСА МОДУЛЯ ЗАЩИТЫ………………….20

8. 6 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ И АДМИНИСТРАТОРА………22

9. ЗАКЛЮЧЕНИЕ………………………….………………………………...24

10. СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ………………………25

ПРИЛОЖЕНИЕ: ЛИСТИНГ ПРОГРАММНЫХ МОДУЛЕЙ


Р
ЕФЕРАТ


курсового проекта Шпаковского С.В.

«Защита форумов от регистрации «спам-ботов»»
Объем работы 24 с., в том числе 9 рис., 6 наим. лит., 1 приложение.

Ключевые слова: интернет, форум, HTML, PHP, база данных, СУБД, сервер, клиент, регистрация, администрирование.

В курсовой работе описан процесс создания модуля для дополнительной защиты форумов при регистрации пользователей.
ВВЕДЕНИЕ


На данный момент в глобальной сети интернет существует огромное количество разнонаправленных форумов. Для того чтобы создать свой собственный форум, необходимо иметь хостинг и доменное имя в сети интернет. Существует довольно много различных готовых движков для создания форумов, все они в основном построены с помощью PHP и СУБД MySQL. В данной работе рассматривает форум, который построен на движке phpBB. Так как данный вид движка очень популярен в глобальной сети, то существует такая проблема, как автоматическая регистрация и размещение на форуме вредоносных и рекламных ссылок от «спам-ботов». «Спам-боты» - это программы, написанные для поиска в сети определенных сайтов, форумов, досок объявлений со слабой защитой при регистрации или размещения объявлений. Данная программа автоматически регистрируется на сетевом ресурсе и размещает во всех темах форумов и досок объявлений рекламные ссылки и вредоносный контент. В данной работе рассматривается создание дополнительного модуля защиты при регистрации пользователей на форуме, построенном на движке phpBB, и внедрением его в дизайн страницы.

1
ПОСТАНОВКА ЗАДАЧИ



Рассмотрим исходный форум на предмет защиты от нежелательной или автоматической регистрации. На данном движке предусмотрено две степени защиты от нежелательной или автоматической регистрации:


1) «Капча» (от англ. CAPTCHA «Completely Automated Public Turing test to tell Computers and Humans Apart») — это полностью автоматизированный публичный тест Тьюринга, используемый для того, чтобы определить, кем является пользователь системы: человеком или компьютером. Основная идея теста: предложить пользователю такую задачу, которую может решить человек, но которую несоизмеримо сложно предоставить для решения компьютеру. В основном это задачи на распознавание символов (рис. 1).




Рис. 1 Образец «капчи».


2) Подтверждение регистрации пользователей администратором форума по электронной почте. При регистрации нового пользователя администратору на адрес электронной почты приходит письмо с данными о регистрации и гиперссылка для активации данного пользователя, до активации пользователь не может создавать новые темы на форуме и участвовать в обсуждении существующих.

Оба вида защиты имеют свои недостатки и уязвимости. «Капча» в виде рисунка с символами подгружается с публичного сервера, а так как данный движок форума существует уже довольно давно, то все виды изображения с текстом уже известны и написание под данный вид защиты «спам-бота» не составляет особой сложности для программиста. Алгоритм основан на распознавание одного из символов на изображении, либо на сравнении размера файла и изображения с исходным. Подтверждение регистрации пользователя по электронной почте имеет недостаток при большом количестве регистрируемых на форуме. Администратор не в силе будет отличить настоящего пользователя от программы, при регистрации хотя бы 10-15 пользователей в день.

Исходя из вышесказанного, было поставлена задача в создании дополнительного модуля защиты при регистрации. Суть модуля в дополнительном тестовом задании на странице регистрации, а именно – в выборе правильного ответа на вопрос или задания, которое размещено на изображении. Так же данный модель создается с возможностью дополнения через администраторскую панель управления.

2
ВЫБОР ТЕХНИЧЕСКИХ СРЕДСТВ И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ



Техническим средством для исполнения задания был выбран персональный компьютер на базе двуядерного процессора AMD Athlon под управлением операционной системы Microsoft Windows 7, соответствующий всем требованиям поставленного перед нами задания.

Программное обеспечение выбиралось исходя из используемых средств при работе с движком форума phpBB, который написан с применением скриптового языка программирования PHP и баз данных MySQL. Для создания и тестирования модуля использовался программный пакет Denwer, который включает в себя:

  1. Язык программирования PHP версии 5.3.

  2. СУБД MySQL версии 5.1.

  3. Административная панель управления базами данных phpMyAdmin версии 2.11

  4. Локальный WEB – сервер Apache версии 2.

Установка пакета происходит в полуавтоматическом режиме, при котором пользователю предлагается выбрать ввести вручную исходный каталог для хранения системных файлов, а так же создать виртуальный диск, содержащий файлы локальных доменов, страниц сайтов и скриптов. Запуск локального web – сервера производится с ярлыка на рабочем столе, проверка функционирования производится набором строки http://localhost/denwer/ в браузере.

3 СТРУКТУРА БАЗЫ ДАННЫХ
3.1 Основы работы с СУБД MySQL
Ссылаясь на то, что исходная база данных форума создается и управляется при помощи СУБД MySQL, для данного проекта было принято решение использовать текущую СУБД для дополнения и администрирования.

SQL обычно описывается как стандартный язык, используемый для взаимодействия с реляционными базами данных. Однако SQL не является языком программирования, как С, C++ или PHP. Скорее, это интерфейсное средство для выполнения различных операций с базами данных, предоставляющее в распоряжение пользователя стандартный набор команд. Возможности SQL не ограничиваются выборкой данных из базы. В SQL поддерживаются разнообразные возможности для взаимодействия с базой данных, в том числе:

  • определение структуры данных — определение конструкций, используемых при хранении данных;

  • выборка данных — загрузка данных из базы и их представление в формате, удобном для вывода;

  • обработка данных — вставка, обновление и удаление информации;

  • контроль доступа — возможность разрешения/запрета выборки, вставки, обновления и удаления данных на уровне отдельных пользователей;

  • контроль целостности данных — сохранение структуры данных при возникновении таких проблем, как параллельные обновления или системные сбои.

В реляционных СУБД данные организуются в виде набора взаимосвязанных таблиц. Связи между таблицами реализуются в виде ссылок на данные других таблиц. Таблицу
 
можно представить себе как двухмерный массив, в котором расположение каждого элемента характеризуется определенными значениями строки и столбца. Пример реляционной базы данных изображен на рис. 2.





Рис. 2 Пример реляционной базы данных.
Как видно из рис. 2, каждая таблица состоит из строк (записей) и столбцов (полей). Каждому полю присваивается уникальное имя. Так же существует связь между таблицами customer и orders, обозначенная стрелкой. В информацию о заказе включается короткий идентификатор клиента, что позволяет избежать избыточного хранения имени и прочих реквизитов клиента. В изображенной базе данных существует еще одна связь — между таблицами orders и products. Эта связь устанавливается по полю prod_id, в котором хранится идентификатор товара, заказанного данным клиентом (определяемого полем custjd). Наличие этих связей позволяет легко ссылаться на полные данные клиента и товара по простым идентификаторам. Правильно организованная база данных превращается в мощное средство организации и эффективного хранения данных с минимальной избыточностью.

Для выполнения операций с базами данных в SQL существует специальный набор общих команд — таких как: SELECT, INSERT, UPDATE и DELETE. Например, если потребуется получить адрес электронной почты клиента с идентификатором 2001cu, достаточно выполнить следующую команду SQL: SELECT cust_email FROM customers WHERE custjd =
 
'2001cu';


Команда построена по шаблону: SELECT имя_поля FROM имя_таблицы [WHERE условие];. Для добавления в таблицу новой записи необходимо выполнить команду SQL: INSERT into
имя_таблицы
VALUES ('значение_поля_1',
 
'значение_поля_2',
 
'значение_поля_
n');
.
Для удаления записей из таблицы используется следующая команда: DELETE
 
FROM
имя_таблицы
WHERE
имя_поля
= 'значение_поля';.

3.2 Стандартные функции PHP для работы с MySQL

В данном разделе описываются стандартные функции PHP для взаимодействия с сервером MySQL. Общая последовательность действий при взаимодействии с сервером MySQL выглядит следующим образом:


  1. Установка соединения с сервером MySQL. Если попытка завершается неудачей, вывести соответствующее сообщение и завершить процесс.

  2. Выбор базы данных сервера MySQL. Если попытка выбора завершается неудачей, вывести соответствующее сообщение и завершить процесс. Допускается одновременное открытие нескольких баз данных для обработки запросов.

  3. Обработка запросов к выбранной базе (или базам).

  4. После завершения обработки запросов закрытие соединения с сервером баз данных.

Соединение с сервером MySQL выполняется с помощью функции mysql_connect( ). Полный синтаксис функции следующий:

int
 
mysql_connect ([string
 
хост [:порт] [:/путь//к/сокету]

[,
 
string
 
имя_пользователя] [,
 
string
 
пароль])



В параметре хост передается имя хостового компьютера, указанное в таблицах привилегий сервера MySQL, оно же используется для перенаправления запросов на web-сервер, на котором работает MySQL, поскольку к серверу MySQL можно подключаться в удаленном режиме. Наряду с именем хоста могут указываться необязательные параметры — номер порта, а также путь к сокету (для локального хоста). Параметры имя_пользователя и пароль должны соответствовать имени пользователя и паролю, заданным в таблицах привилегий MySQL. Все параметры являются необязательными, поскольку таблицы привилегий можно настроить таким образом, чтобы они допускали соединение без проверки. Если параметр хост не задан, mysql_connect( ) пытается установить связь с локальным хостом.

Пример открытия соединения с MySQL:
@mysql_connect("local host", "web", "4tf9zzzf") or die("Could not connect to MySQL server!");

В данном примере localhost — имя компьютера, web — имя пользователя, а 4tf9zzzf — пароль. Знак @ перед вызовом функции mysql_connect( ) подавляет все сообщения об ошибках, выдаваемые при неудачной попытке подключения, — они заменяются сообщением, указанным при вызове die( ). Значение, возвращаемое при вызове mysql_connect( ), в данном примере не используется. Если в программе используется всего одно соединение с сервером MySQL, это вполне нормально. Но если программа устанавливает соединения с несколькими серверами MySQL на разных хостах, следует сохранить идентификатор соединения, возвращаемый при вызове mysql_connect( ), чтобы адресовать последующие команды нужному серверу MySQL. Пример:



$link1 = @mysql_connect("www.somehost.com", "web", "abcde")

or die("Could not connect to MySQL server!");

$linkl = @mysql_connect("www.someotherhost.com", "usr", "secret")

or die("Could not connect to MySQL server!");

?>
Идентификаторы $link1 и $link2 передаются при последующих обращениях к базам данных с запросами. 
После успешного соединения с MySQL необходимо выбрать базу данных, находящуюся на сервере. Для этого используется функция mysql_select_db( ). Синтаксис функции mysql_select_db( ):
int
 
mysql_select_db (string
 
имя_базы_данных [,
 
int
 
идентификатор_соединения])

Параметр имя_базы_данных определяет выбираемую базу данных, идентификатор которой возвращается функцией mysql_select_db( ). Параметр идентификатор_соединения необязателен лишь при одном открытом соединении с сервером MySQL. При наличии нескольких открытых соединений этот параметр должен указываться.

После завершения работы с сервером MySQL соединение необходимо закрыть. Функция mysql_close( ) закрывает соединение, определяемое необязательным параметром. Если параметр не задан, функция mysql_close( ) закрывает последнее открытое соединение. Синтаксис функции mysql_close():

int mysql_close ([int идентификатор_соединения])

Функция mysql_query( ) обеспечивает интерфейс для обращения с запросами к базам данных. Синтаксис функции mysql_query( ):

int
 
mysql_query (string
 
запрос [,
 
int
 
идентификатор_соединения])


Параметр запрос содержит текст запроса на языке SQL. Запрос передается либо соединению, определяемому необязательным параметром идентификатор_соединения, либо, при отсутствии параметра, последнему открытому соединению.

Во многих ситуациях требуется узнать количество записей, участвующих в запросе SQL с командами INSERT, UPDATE, REPLACE или DELETE. Задача решается функцией mysql_affected_rows( ). Синтаксис функции:

int
 
mysql_affected_rows ([int
 
идентификатор_соединения])


Параметр идентификатор_соединения не является обязательным. Если он не указывается, mysql_affected_rqws( ) пытается использовать последнее открытое соединение. 

Функция mysql_affected_rows( ) не работает с запросами, основанными на команде SELECT. Для определения количества записей, возвращенных при вызове SELECT, используется функция mysql_num_rows( ), которая определяет количество записей, возвращаемых командой SELECT. Синтаксис функции:
int mysql_num_rows(int результат)
Функция mysql_result() используется в сочетании с mysql_query( ) (при выполнении запроса с командой SELECT) для получения набора данных. Синтаксис функции:

int
 
mysql_result (int
 
идентификатор_результата,
 
int
 
запись [,
 
mixed
 
поле])



В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query( ). Параметр запись ссылается на определенную запись набора данных, определяемого параметром идентификатор_результата. В необязательном параметре поле могут передаваться:

  • смещение поля в таблице;

  • имя поля;

  • имя поля в формате имя_поля_имя_таблицы.

3.3
Дополнительные таблицы базы данных для защитного модуля


Для правильного функционирования модуля защиты необходимо дополнить текущую базу данных дополнительными таблицами, в которых будут содержаться вопросы и варианты ответов к ним, а так же используемые изображения для дополнительной проверки пользователей при регистрации (рис. 3). Для этого создадим файл со скриптом PHP, который добавит нужную нам таблицу в базу данных на начальном этапе установки модуля.
$sql = array(

"CREATE TABLE {$table_prefix}anti_bot_quest (

id mediumint(8) NOT NULL auto_increment,

question text NOT NULL,

answer1 varchar(255) NOT NULL default '',

answer2 varchar(255) NOT NULL default '',

answer3 varchar(255) NOT NULL default '',

answer4 varchar(255) NOT NULL default '',

answer5 varchar(255) NOT NULL default '',

anti_bot_img varchar(255) NOT NULL default '',

lang varchar(255) NOT NULL default '',

use_html CHAR( 1 ) DEFAULT '0' NOT NULL,

PRIMARY KEY (id)

) TYPE=MyISAM AUTO_INCREMENT=1;"

Данная часть кода файла, добавляет в базу таблицу по названию модуля anti_bot_quest, которая включает в себя:

  • id mediumint(8) – уникальный идентификатор вопроса;

  • question textполе для вопроса;

  • answer1…5 – варианты ответов на вопрос;

  • anti_bot_img varcharполе для изображения, если оно используется при вопросе;

  • lang varcharязык, на котором задается вопрос;

  • use_htmlиспользование HTML тэгов, при составлении вопроса.

Рис. 3 Пример заполненной таблицы базы данных.

4 СТРУКТУРА ПРИЛОЖЕНИЯ

    1. 4.1 Основные функции создаваемого модуля


При создании данного приложения было взято в расчет то, что данный модуль не может быть статическим, без возможности изменения и дополнения функций защиты, так как многие «спам-боты» легко и быстро подстраиваются под определенный вид статической защиты.

Динамически изменяемый набор защиты состоит в том, что в любой момент администратор форума может изменить контрольные вопросы и изображения при регистрации через панель управления форумом. Для этого необходимо добавить в администраторскую панель раздел, который позволит составлять новые вопросы, редактировать существующие и добавлять изображения. Так как форум использует шаблоны для генерации страниц, необходимо создать файлы шаблона с расширением tpl для администраторского раздела (листинг файлов шаблонов находится в приложении).

Файлы шаблонов модуля защиты:

  1. anti_bot_config_body.tpl – шаблон основной конфигурации модуля;

  2. anti_bot_quest_body.tplшаблон основного раздела модуля;

  3. anti_bot_quest_delete_body.tplшаблон удаления вопросов;

  4. anti_bot_quest_edit_body.tplшаблон редактирования вопросов.

Данные файлы копируются в директорию форума, содержащую все используемые шаблоны.

    1. 4.2 Установка модуля защиты


В начале установки модуля, необходимо скопировать скрипты PHP в соответствующие директории форума. Список файлов для копирования:

  • db_update.phpфайл обновления базы данных;

  • admin/admin_anti_bot_config.php – скрипт основной конфигурации модуля;

  • admin/admin_anti_bot_quest.php – скрипт создания и редактирования вопросов;

  • images/anti_bot/example1…5.jpg – файлы изображений для вопросов;

Полный листинг файлов php находится в приложении.

Для правильного функционирования приложения, необходимо внести изменения в существующие файлы движка форума. Изменения в файлы вносятся с помощью редактора phpEdit.

Файл constants.php содержит основные константы движка форума, в него необходимо добавить новые данные нашего модуля:

// Anti Bot Question Mod Начало модуля

define('ANTI_BOT_QUEST_TABLE', $table_prefix.'anti_bot_quest');

// Anti Bot Question Mod – Конец модуля


Файл usercp_register.php – скрипт обрабатывающий данные, переданные при регистрации нового пользователя. Добавляем в него код модуля:

//находим строку обработки встроенной стандартной защиты

$error = TRUE;

$error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $lang['Confirm_code_wrong'];


}

$db->sql_freeresult($result);

}

}

//добавляем код инициализации модуля

// Anti Bot Question Mod - Начало

if (($mode == 'register') && ($board_config['anti_bot_quest']))

{

$abq_aw = htmlspecialchars(stripslashes($abq_aw));

$abq_id = intval(htmlspecialchars(stripslashes($idabq)));

$sql = 'SELECT answer1, answer2, answer3, answer4, answer5

FROM ' . ANTI_BOT_QUEST_TABLE . '

WHERE id = ' . $abq_id;

if(!$result = $db->sql_query($sql))

{

message_die(GENERAL_ERROR, 'Could not obtain anti-bot-question information', '', __LINE__, __FILE__, $sql);

}

if( $db->sql_numrows($result) == 0 )

{

$sql = 'SELECT answer1, answer2, answer3, answer4, answer5

FROM ' . ANTI_BOT_QUEST_TABLE . '

WHERE lang = \'' . $board_config['default_lang'] . '\'

LIMIT 1';

if(!$result = $db->sql_query($sql))

{

message_die(GENERAL_ERROR, 'Could not obtain anti-bot-question information', '', __LINE__, __FILE__, $sql);

}

if( $db->sql_numrows($result) == 0 )

{



}

else

{

$error = TRUE;

$error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $lang['ABQ_Incorrect'];


}

}

else

{

$abqrow = $db->sql_fetchrow($result);

if ($board_config['anti_bot_quest_casesen'])

{

if (($abq_aw == $abqrow['answer1']) || (($abqrow['answer2'] != '') && ($abq_aw == $abqrow['answer2'])) || (($abqrow['answer3'] != '') && ($abq_aw == $abqrow['answer3'])) || (($abqrow['answer4'] != '') && ($abq_aw == $abqrow['answer4'])) || (($abqrow['answer5'] != '') && ($abq_aw == $abqrow['answer5'])))

{}

else

{

$error = TRUE;

$error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $lang['ABQ_Incorrect'];


}

}

else

{

$abq_aw = strtolower($abq_aw);

if (($abq_aw == strtolower($abqrow['answer1'])) || (($abqrow['answer2'] != '') && ($abq_aw == strtolower($abqrow['answer2']))) || (($abqrow['answer3'] != '') && ($abq_aw == strtolower($abqrow['answer3']))) || (($abqrow['answer4'] != '') && ($abq_aw == strtolower($abqrow['answer4']))) || (($abqrow['answer5'] != '') && ($abq_aw == strtolower($abqrow['answer5']))))

{}

else

{

$error = TRUE;

$error_msg .= ( ( isset($error_msg) ) ? '
' : '' ) . $lang['ABQ_Incorrect'];


}

}

}

}

// Anti Bot Question Mod – Конец

//находим объявление переменных для шаблонов страниц

'CONFIRM_IMG' => $confirm_image,

//добавляем переменные шаблонов модуля

// Anti Bot Question Mod - Начало

'L_ABQ_Quest' => $abq_quest,

'L_ABQ_EXPLAIN' => ($board_config['anti_bot_quest_casesen']) ? $lang['ABQ_explain'].' '.$lang['ABQ_explain2'] : $lang['ABQ_explain'],

'L_ABQ_IMAGE' => $abq_image,

'L_ABQ_QUESTION' => $lang['ABQ_Question'],

'L_ABQ_ANSWER' => $lang['ABQ_Answer'],

'L_ABQ_VARNAME' => $board_config['anti_bot_quest_get'],

// Anti Bot Question Mod – Конец


Файл lang_admin.php содержит переменные для генерации шаблона администраторского раздела. В него необходимо добавить новые переменные нашего модуля, для доступа к настройкам.

//в конец файла добавляем переменные модуля

// Anti Bot Question Mod - Начало

$lang['Anti_Bot_Quest'] = 'ABQ';

$lang['Anti_Bot_Question'] = 'Включить Anti Bot Question при регистрации';

$lang['Anti_Bot_Question_explain'] = 'Чтобы зарегистрироваться, пользователь должен будет правильно ответить на вопрос';

$lang['ABQ_Admin_Title'] = 'Администрирование ABQ';

$lang['ABQ_Delete_Title'] = 'Удалить Anti Bot Question';

$lang['ABQ_Admin_Explain'] = 'Здесь ты можешь создать новые вопросы и отредактировать или удалить старые.
Мод при регистрации использует один из вопросов. Они выбираются случайным образом.

Пример:
Вопрос: Что из названного - фрукт? Кастрюля, Апельсин, Дуб, Медвед
Ответ: Апельсин
';


$lang['ABQ_Question'] = 'Вопрос';

$lang['ABQ_Answer'] = 'Ответ';

$lang['ABQ_Answer_Explain'] = 'Регистрозависимый!';

$lang['ABQ_CaseSensitive'] = 'Учитывать при ответе заглавные и строчные буквы';

$lang['ABQ_VarName'] = 'Настройка переменной';

$lang['ABQ_VarName_Explain'] = 'Сделай любую комбинацию. На регистрации нормальных посетителей это не отразится.';

$lang['Anti_Bot_Question_Guest'] = 'Включить Anti Bot Question для гостей';

$lang['Anti_Bot_Question_Guest_explain'] = 'Гость должен будет правильно ответить на вопрос, чтобы оставить сообщение';

$lang['ABQ_Use_HTML'] = 'Использовать HTML';

$lang['ABQ_Use_HTML_Explain'] = 'Чтобы использовать в вопросе HTML-код, выбери \'Да\'.
Следующие теги нельзя будет использовать (независимо от этой настройки): <textarea> <table>';


$lang['ABQ_ImageURL'] = 'URL картинки';

$lang['ABQ_Image'] = 'Картинка';

$lang['ABQ_No_Image'] = 'Выбранного изображения не существует';

$lang['ABQ_Image_DNE'] = 'Не существует';

$lang['ABQ_Create_Question'] = 'Создать вопросы и ответы';

$lang['ABQ_Edit_Question'] = 'Редактировать вопрос';

$lang['ABQ_Delete_Question'] = 'Удалить вопрос';

$lang['ABQ_No_questions'] = '
Нету вопросов для ABQ

';


$lang['ABQ_not_updated'] = 'База не обновлена.';

$lang['ABQ_Question_too_long'] = 'Твой вопрос слишком длинный (макс. %s знаков)';

$lang['ABQ_Answer_too_long'] = 'Как минимум один из ответов слишком длинный (максимальная длина %s знаков)';

$lang['ABQ_Missed_Question'] = 'Ты должен выбрать вопрос для ABQ';

$lang['ABQ_Missed_Answer'] = 'Ты должен выбрать как минимум один ответ для ABQ';

$lang['ABQ_New_Question_created'] = 'Новый вопрос для ABQ добавлен';

$lang['ABQ_BildPHP'] = 'Используй файл bild.php для показа изображений';

$lang['ABQ_BildPHP_Explain'] = 'Этот файл делает идентификацию картинки более сложной для ботов (возможно не на всех серверах). Проверь, если тестовое изображение здесь есть, то нужно активизировать эту опцию.';

$lang['ABQ_Configuration'] = 'Конфигурация';

$lang['ABQ_Questions'] = 'Вопросы';

$lang['Anti_Bot_Quest_MOD'] = 'Anti Bot Question';

$lang['ABQ_Config'] = 'Anti Bot Question';

$lang['ABQ_Config_explain'] = 'Эта форма позволит настроить ABQ';

$lang['ABQ_Config_updated'] = 'Конфигурация ABQ успешно обновлена';

$lang['ABQ_Click_return_config'] = '%sВернуться к настройкам ABQ %s';

$lang['ABQ_confirm_aktiv'] = 'Код визуального подтверждения тоже сейчас включен';

// Anti Bot Question Mod – Конец


Файл lang_main.php содержит переменные для генерации шаблонов основных страниц форума. Добавляем в него переменные модуля:

// в конец файла добавляем переменные модуля

// Anti Bot Question Mod - Начало

$lang['ABQ_explain'] = 'Этот вопрос нужен для защиты от автоматических регистраций.';

$lang['ABQ_post_explain'] = 'Этот вопрос нужен для защиты от автоматических сообщений.';

$lang['ABQ_explain2'] = '(регистрозависимый)';

$lang['ABQ_Incorrect'] = 'ОТВЕТ НЕПРАВИЛЬНЫЙ!';

$lang['ABQ_Question'] = 'Вопрос';

$lang['ABQ_Answer'] = 'Ваш ответ';

// Anti Bot Question Mod – Конец

Файл profile_add_body.tpl – шаблон страницы регистрации нового пользователя. В него необходимо добавить дополнительные html тэги, для отображения модуля защиты при регистрации.

//находим окончание модуля стандартной защиты форума



{L_CONFIRM_CODE}: *
{L_CONFIRM_CODE_EXPLAIN}








//добавляем отображение дополнительного модуля защиты

anti_bot_question —>

<tr>

{L_ABQ_QUESTION}:


{L_ABQ_EXPLAIN}

{L_ABQ_Quest}{L_ABQ_IMAGE}







{L_ABQ_ANSWER}: *







Конец anti_bot_question >


После редактирования закрываем и сохраняем все измененные файлы.

Перед копированием файлов на сервер, необходимо протестировать работоспособность модуля на локальном сервере с помощью программного пакета Denwer.

  1. ОПИСАНИЕ ИНТЕРФЕЙСА МОДУЛЯ ЗАЩИТЫ


Основной интерфейс пользователя, созданного модуля, находится на странице регистрации. Он включает в себя (рис. 4):

  1. Поле с вопросом и вариантами ответов, либо с заданием на изображении;

  2. Поле для ввода ответа на вопрос.




Рис. 4 Интерфейс пользователя при регистрации


Основные настройки модуля, с возможностью создания новых вопросов, редактированием существующих, добавлением новых изображений, а так же отключением модуля – находится в администраторском разделе форума. Он включает в себя:

  1. Основную конфигурацию модуля (рис. 5);

Рис. 5 Основные настройки

  1. Форма отображения существующих вопросов и управление ими (рис. 6);

Рис. 6 Интерфейс управления вопросами и изображениями

  1. Форма создания нового вопроса или редактирования существующего (рис. 7).

Рис. 7 Интерфейс создания нового вопроса

  1. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ И АДМИНИСТРАТОРА

При регистрации пользователь должен правильно ответить на вопрос, задаваемый модулем защиты (рис. 4), в противном случае регистрация не будет произведена, и пользователь не сможет участвовать в обсуждении тем на форуме и создавать новые.

Руководство администратора включает в себя:

  • настройка основной конфигурации модуля (рис. 5)

  • составление контрольных вопросов модуля (вопросы должны быть понятными обычному пользователю, а так же могут содержать варианты ответов)

  • включение в вопрос изображения с тестовым заданием для пользователя (файл изображения может быть в формате jpg, bmp или gif, в настройке указывается путь к файлу (рис. 7))

  • создание вариантов ответов на контрольные вопросы (количество вариантов может быть не более пяти (рис. 7))

  • редактирование и/или удаление существующих вопросов (рис. 6)


Настройка основной конфигурации производится выбором соответствующих полей в интерфейсе основной настройки (рис. 5). Сохранение изменений производится нажатием кнопки «Отправить».

Составление контрольных вопросов производится нажатием кнопки «Создать вопросы и ответы» в интерфейсе управления (рис. 6). После нажатия соответствующей кнопки, необходимо заполнить форму (рис. 7). Ввести текст вопроса, установить выбор использования HTML тэгов, указать путь к используемому изображению (если оно необходимо в тестовом задании), заполнить форму правильных ответов на вопрос. Сохранение изменений производится нажатием кнопки «Создать вопросы и ответы» (рис. 8).



Рис. 8 Пример создания нового вопроса

Редактирование существующих вопросов производиться в интерфейсе управления вопросами (рис. 6), для этого необходимо нажать на ссылку «Изменить» напротив соответствующего вопроса. В появившейся форме необходимо внести изменения в поля вопроса и/или ответов. Сохранение изменений производится нажатием кнопки «Редактировать вопрос» (рис. 9).




Рис. 9 Пример редактирования вопроса

Удаление существующих вопросов производиться в интерфейсе управления вопросами (рис. 6), для этого необходимо нажать на ссылку «Удалить» напротив соответствующего вопроса. В появившимся окне необходимо подтвердить удаление нажатием кнопки «Да», либо отменить удаление нажатием кнопки «Нет».

ЗАКЛЮЧЕНИЕ


В данной работе было рассмотрено создание дополнительной защиты для определенного вида форумов. Созданный модуль прост в установке и настройке, имеет дружественный к пользователю интерфейс. Количество создаваемых тестовых заданий может быть очень велико и зависит лишь от фантазии администратора. Использование изображений в заданиях, позволяет дополнительно усилить защиту при регистрации. Так как модуль использует в отображении шаблоны страниц, то он может быть легко подстроен под определенный дизайн страницы.

При использовании данного дополнения, количество не желаемых регистраций на форуме сократилось на 80%, а автоматическое размещение в темах форума вредоносных ссылок и рекламных объявлений на 95%.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Спейнауэр С., Куэрсиа В. Справочник Web-мастера. - К: "BHV", 1997. - 368 с.

  2. Яргер Р., Риз Дж., Кинг Т. MySQL и mSQL. Базы данных для небольших предприятий и Интернета. - СПб: Символ-Плюс, 2000 - 560 с.

  3. Ратшиллер Т., Геркен Т. PHP4: разработка Web-приложений. - СПб: Питер, 2001. - 384 с.

  4. Томсон Л., Веллинг Л. Разработка Web-приложений на PHP и MySQL. - К.: "ДиаСофт", 2001. - 672 с.

  5. Интернет ресурс http://ru.wikipedia.org/.

  6. Интернет ресурс http://php.su/.

ПРИЛОЖЕНИЕ: ЛИСТИНГ ПРОГРАММНЫХ МОДУЛЕЙ

  1. Листинг файла admin_anti_bot_config.php




/***************************************************************************

* admin_anti_bot_config.php

***************************************************************************/

define('IN_PHPBB', true);

if( !empty($setmodules) )

{

$filename = basename(__FILE__);

$module['Anti_Bot_Quest_MOD']['ABQ_Configuration'] = $filename;

return;

}

//

// Корневой каталог phphBB

//

$phpbb_root_path = "./../";

require($phpbb_root_path . 'extension.inc');

require('./pagestart.' . $phpEx);

//

// Антибот конфиг

//

$sql = "SELECT *

FROM " . CONFIG_TABLE . "

WHERE config_name LIKE 'anti_bot_quest%' OR config_name = 'enable_confirm'";

if(!$result = $db->sql_query($sql))

{

message_die(CRITICAL_ERROR, "Could not query config information in admin_anti_bot_config", "", __LINE__, __FILE__, $sql);

}

else

{

while( $row = $db->sql_fetchrow($result) )

{

$config_name = $row['config_name'];

$config_value = $row['config_value'];

$default_config[$config_name] = isset($HTTP_POST_VARS['submit']) ? str_replace("'", "\'", $config_value) : $config_value;



$new[$config_name] = ( isset($HTTP_POST_VARS[$config_name]) ) ? $HTTP_POST_VARS[$config_name] : $default_config[$config_name];

if (($config_name == 'anti_bot_quest_get') && (isset($HTTP_POST_VARS['abq_get_s1'])))

{

$abq_new_get = '';

if (isset($HTTP_POST_VARS['abq_get_s1']))

{

$abq_new_get .= $HTTP_POST_VARS['abq_get_s1'];

}

if (isset($HTTP_POST_VARS['abq_get_s2']))

{

$abq_new_get .= $HTTP_POST_VARS['abq_get_s2'];

}

if (isset($HTTP_POST_VARS['abq_get_s3']))

{

$abq_new_get .= $HTTP_POST_VARS['abq_get_s3'];

}

if (isset($HTTP_POST_VARS['abq_get_s4']))

{

$abq_new_get .= $HTTP_POST_VARS['abq_get_s4'];

}

if (isset($HTTP_POST_VARS['abq_get_s5']))

{

$abq_new_get .= $HTTP_POST_VARS['abq_get_s5'];

}

if (isset($HTTP_POST_VARS['abq_get_s6']))

{

$abq_new_get .= $HTTP_POST_VARS['abq_get_s6'];

}

if (preg_match('/\A[a-z_]{2,5}[0-9]{4}[0-9a-z]{0,5}\z/',$abq_new_get))

{

$new['anti_bot_quest_get'] = $abq_new_get;

}

}

if( isset($HTTP_POST_VARS['submit']) )

{

$sql = "UPDATE " . CONFIG_TABLE . " SET

config_value = '" . str_replace("\'", "''", $new[$config_name]) . "'

WHERE config_name = '$config_name'";

if( !$db->sql_query($sql) )

{

message_die(GENERAL_ERROR, "Failed to update general configuration for $config_name", "", __LINE__, __FILE__, $sql);

}

}

}

if( isset($HTTP_POST_VARS['submit']) )

{

$message = $lang['ABQ_Config_updated'] . "

" . sprintf($lang['ABQ_Click_return_config'], "", "") . "

" . sprintf($lang['Click_return_admin_index'], "", "");


message_die(GENERAL_MESSAGE, $message);

}

}

$anti_bot_quest_yes = ($new['anti_bot_quest']) ? 'checked="checked"' : '';

$anti_bot_quest_no = (!$new['anti_bot_quest']) ? 'checked="checked"' : '';

$anti_bot_quest_guest_yes = ($new['anti_bot_quest_guest']) ? 'checked="checked"' : '';

$anti_bot_quest_guest_no = (!$new['anti_bot_quest_guest']) ? 'checked="checked"' : '';

$anti_bot_quest_casesen_yes = ($new['anti_bot_quest_casesen']) ? 'checked="checked"' : '';

$anti_bot_quest_casesen_no = (!$new['anti_bot_quest_casesen']) ? 'checked="checked"' : '';

$anti_bot_quest_bild_yes = ($new['anti_bot_quest_bild']) ? 'checked="checked"' : '';

$anti_bot_quest_bild_no = (!$new['anti_bot_quest_bild']) ? 'checked="checked"' : '';

if ($new['anti_bot_quest_get'] != '')

{

$abq_get_t2 = '';

if (preg_match('/\A(fg|ih|zg)[0-9]{4}[0-9a-z]{0,5}\z/',$new['anti_bot_quest_get']))

{

$abq_get_t1 = strval(substr($new['anti_bot_quest_get'],0,2));

$abq_get_z1 = strval(substr($new['anti_bot_quest_get'],2,1));

$abq_get_z2 = strval(substr($new['anti_bot_quest_get'],3,1));

$abq_get_z3 = strval(substr($new['anti_bot_quest_get'],4,1));

$abq_get_z4 = strval(substr($new['anti_bot_quest_get'],5,1));

if (strlen($new['anti_bot_quest_get']) > 6)

{

$abq_get_t2 = strval(substr($new['anti_bot_quest_get'],6));

}

}

elseif (preg_match('/\A(bfj|g_e|www|xwe|xxx)[0-9]{4}[0-9a-z]{0,5}\z/',$new['anti_bot_quest_get']))

{

$abq_get_t1 = strval(substr($new['anti_bot_quest_get'],0,3));

$abq_get_z1 = strval(substr($new['anti_bot_quest_get'],3,1));

$abq_get_z2 = strval(substr($new['anti_bot_quest_get'],4,1));

$abq_get_z3 = strval(substr($new['anti_bot_quest_get'],5,1));

$abq_get_z4 = strval(substr($new['anti_bot_quest_get'],6,1));

if (strlen($new['anti_bot_quest_get']) > 7)

{

$abq_get_t2 = strval(substr($new['anti_bot_quest_get'],7));

}

}

elseif (preg_match('/\A(abq_|home|name|sfhf|www_)[0-9]{4}[0-9a-z]{0,5}\z/',$new['anti_bot_quest_get']))

{

$abq_get_t1 = strval(substr($new['anti_bot_quest_get'],0,4));

$abq_get_z1 = strval(substr($new['anti_bot_quest_get'],4,1));

$abq_get_z2 = strval(substr($new['anti_bot_quest_get'],5,1));

$abq_get_z3 = strval(substr($new['anti_bot_quest_get'],6,1));

$abq_get_z4 = strval(substr($new['anti_bot_quest_get'],7,1));

if (strlen($new['anti_bot_quest_get']) > 8)

{

$abq_get_t2 = strval(substr($new['anti_bot_quest_get'],8));

}

}

elseif (preg_match('/\A(email|ldknf|name_|rgwsf)[0-9]{4}[0-9a-z]{0,5}\z/',$new['anti_bot_quest_get']))

{

$abq_get_t1 = strval(substr($new['anti_bot_quest_get'],0,5));

$abq_get_z1 = strval(substr($new['anti_bot_quest_get'],5,1));

$abq_get_z2 = strval(substr($new['anti_bot_quest_get'],6,1));

$abq_get_z3 = strval(substr($new['anti_bot_quest_get'],7,1));

$abq_get_z4 = strval(substr($new['anti_bot_quest_get'],8,1));

if (strlen($new['anti_bot_quest_get']) > 9)

{

$abq_get_t2 = strval(substr($new['anti_bot_quest_get'],9));

}

}

else

{

$new['anti_bot_quest_get'] = '';

}

}

if ($new['anti_bot_quest_get'] == '')

{

$new['anti_bot_quest_get'] = 'abq_0001';

$abq_get_t1 = 'abq_';

$abq_get_t2 = '';

$abq_get_z1 = '0';

$abq_get_z2 = '0';

$abq_get_z3 = '0';

$abq_get_z4 = '1';

}

$abq_get_A1 = array();

$abq_get_A1[] = 'abq_';

$abq_get_A1[] = 'bfj';

$abq_get_A1[] = 'email';

$abq_get_A1[] = 'fg';

$abq_get_A1[] = 'g_e';

$abq_get_A1[] = 'home';

$abq_get_A1[] = 'ih';

$abq_get_A1[] = 'ldknf';

$abq_get_A1[] = 'name';

$abq_get_A1[] = 'name_';

$abq_get_A1[] = 'rgwsf';

$abq_get_A1[] = 'sfhf';

$abq_get_A1[] = 'www';

$abq_get_A1[] = 'www_';

$abq_get_A1[] = 'xwe';

$abq_get_A1[] = 'xxx';

$abq_get_A1[] = 'zg';

$abq_get_A2 = array();

$abq_get_A2[] = '';

$abq_get_A2[] = '001';

$abq_get_A2[] = '3567';

$abq_get_A2[] = '94859';

$abq_get_A2[] = 'abf';

$abq_get_A2[] = 'f';

$abq_get_A2[] = 'sfgr';

$abq_get_A2[] = 'uc';

$abq_get_A2[] = 'dsdvg';

$abq_get_s1 = '';

for ($i=0; $i

{

if ($abq_get_A1[$i] == $abq_get_t1)

{

$abq_get_selected = ' selected="selected"';

}

else

{

$abq_get_selected = "";

}

$abq_get_s1 .= '';

}

$abq_get_s2 = '';

for ($i=0; $i<10; $i++)

{

if (strval($i) == $abq_get_z1)

{

$abq_get_selected = ' selected="selected"';

}

else

{

$abq_get_selected = "";

}

$abq_get_s2 .= '';

}

$abq_get_s3 = '';

for ($i=0; $i<10; $i++)

{

if (strval($i) == $abq_get_z2)

{

$abq_get_selected = ' selected="selected"';

}

else

{

$abq_get_selected = "";

}

$abq_get_s3 .= '';

}

$abq_get_s4 = '';

for ($i=0; $i<10; $i++)

{

if (strval($i) == $abq_get_z3)

{

$abq_get_selected = ' selected="selected"';

}

else

{

$abq_get_selected = "";

}

$abq_get_s4 .= '';

}

$abq_get_s5 = '';

for ($i=0; $i<10; $i++)

{

if (strval($i) == $abq_get_z4)

{

$abq_get_selected = ' selected="selected"';

}

else

{

$abq_get_selected = "";

}

$abq_get_s5 .= '';

}

$abq_get_s6 = '';

for ($i=0; $i

{

if ($abq_get_A2[$i] == $abq_get_t2)

{

$abq_get_selected = ' selected="selected"';

}

else

{

$abq_get_selected = "";

}

$abq_get_s6 .= '';

}

$template->set_filenames(array(

"body" => "admin/anti_bot_config_body.tpl")

);

//

// Убираем ковычки в описании сайта, дабы не было проблем)))

//

$template->assign_vars(array(

'S_CONFIG_ACTION' => append_sid("admin_anti_bot_config.$phpEx"),

'L_YES' => $lang['Yes'],

'L_NO' => $lang['No'],

'L_SUBMIT' => $lang['Submit'],

'L_RESET' => $lang['Reset'],

'L_CONFIGURATION_TITLE' => $lang['ABQ_Config'],

'L_CONFIGURATION_EXPLAIN' => $lang['ABQ_Config_explain'],

'L_GENERAL_SETTINGS' => $lang['ABQ_Config'],

'S_ABQ_VERSION' => $lang['ABQ_Version'],

'L_ANTI_BOT_QUEST' => $lang['Anti_Bot_Question'],

'L_ANTI_BOT_QUEST_EXPLAIN' => $lang['Anti_Bot_Question_explain'],

'L_ANTI_BOT_QUEST_CONFIRM' => ($new['enable_confirm']) ? '
'.$lang['ABQ_confirm_aktiv'] : '',


'L_ANTI_BOT_QUEST_GUEST' => $lang['Anti_Bot_Question_Guest'],

'L_ANTI_BOT_QUEST_GUEST_EXPLAIN' => $lang['Anti_Bot_Question_Guest_explain'],

'L_ANTI_BOT_QUEST_CASESEN' => $lang['ABQ_CaseSensitive'],

'L_ANTI_BOT_QUEST_BILD' => $lang['ABQ_BildPHP'],

'L_ANTI_BOT_QUEST_BILD_EXPLAIN' => $lang['ABQ_BildPHP_Explain'] . '
',


'L_ANTI_BOT_QUEST_VARNAME' => $lang['ABQ_VarName'],

'L_ANTI_BOT_QUEST_VARNAME_EXPLAIN' => $lang['ABQ_VarName_Explain'],

'ANTI_BOT_QUEST_ENABLE' => $anti_bot_quest_yes,

'ANTI_BOT_QUEST_DISABLE' => $anti_bot_quest_no,

'ANTI_BOT_QUEST_GUEST_ENABLE' => $anti_bot_quest_guest_yes,

'ANTI_BOT_QUEST_GUEST_DISABLE' => $anti_bot_quest_guest_no,

'ANTI_BOT_QUEST_CASESEN_ENABLE' => $anti_bot_quest_casesen_yes,

'ANTI_BOT_QUEST_CASESEN_DISABLE' => $anti_bot_quest_casesen_no,

'ANTI_BOT_QUEST_BILD_ENABLE' => $anti_bot_quest_bild_yes,

'ANTI_BOT_QUEST_BILD_DISABLE' => $anti_bot_quest_bild_no,

'ANTI_BOT_QUEST_VARNAME1' => $abq_get_s1,

'ANTI_BOT_QUEST_VARNAME2' => $abq_get_s2,

'ANTI_BOT_QUEST_VARNAME3' => $abq_get_s3,

'ANTI_BOT_QUEST_VARNAME4' => $abq_get_s4,

'ANTI_BOT_QUEST_VARNAME5' => $abq_get_s5,

'ANTI_BOT_QUEST_VARNAME6' => $abq_get_s6)

);

$template->pparse("body");

include('./page_footer_admin.'.$phpEx);

?>

  1. Листинг файла admin_anti_bot_quest.php



/**************************************************************************

* admin_anti_bot_quest.php

***************************************************************************/


define('IN_PHPBB', true);

if( !empty($setmodules) )

{

$filename = basename(__FILE__);

$module['Anti_Bot_Quest_MOD']['ABQ_Questions'] = $filename;

return;

}
//

// Ищим корневой каталог форума

//

$phpbb_root_path = '../';

require($phpbb_root_path . 'extension.inc');

require('./pagestart.' . $phpEx);

include($phpbb_root_path . 'includes/functions_selects.'.$phpEx);

$ABQ_Question_Maxlenght = 1000;

$ABQ_Answer_Maxlenght = 250;

if (!isset($HTTP_POST_VARS['mode']))

{

if (!isset($HTTP_GET_VARS['action']))

{

$template->set_filenames(array(

'body' => 'admin/anti_bot_quest_body.tpl')

);

$template->assign_vars(array(

'L_ABQ_TITLE' => $lang['ABQ_Admin_Title'],

'L_ABQ_EXPLAIN' => $lang['ABQ_Admin_Explain'],

'L_ABQ_ANSWER' => $lang['ABQ_Answer'],

'L_ABQ_IMAGE' => $lang['ABQ_Image'],

'L_CREATE_QUESTION' => $lang['ABQ_Create_Question'],

'L_EDIT' => $lang['Edit'],

'L_DELETE' => $lang['Delete'],

'L_ACTION' => $lang['Action'],

'L_BOARD_LANGUAGE' => $lang['Board_lang'],

'S_ABQ_VERSION' => $lang['ABQ_Version'],

'U_ABQ_ACTION' => append_sid('admin_anti_bot_quest.'.$phpEx))

);

$sql = 'SELECT *

FROM ' . ANTI_BOT_QUEST_TABLE . '

ORDER BY lang ASC, anti_bot_img ASC, question ASC';

if(!$result = $db->sql_query($sql))

{

message_die(GENERAL_ERROR, 'Could not query anti-bot-question information', '', __LINE__, __FILE__, $sql);

}

while ($row = $db->sql_fetchrow($result))

{

$abqrow[] = $row;

}

$abq_count = count($abqrow);

if ($abq_count > 0)

{

for ($i=0; $i<$abq_count; $i++)

{

$abq_aw = $abqrow[$i]['answer1'];

if ($abqrow[$i]['answer2'] != '')

{

$abq_aw = 'A) ' . $abq_aw . '
B) ' . $abqrow[$i]['answer2'] . '
';


}

if ($abqrow[$i]['answer3'] != '')

{

$abq_aw .= 'C) ' . $abqrow[$i]['answer3'] . '
';


}

if ($abqrow[$i]['answer4'] != '')

{

$abq_aw .= 'D) ' . $abqrow[$i]['answer4'] . '
';


}

if ($abqrow[$i]['answer5'] != '')

{

$abq_aw .= 'E) ' . $abqrow[$i]['answer5'] . '
';


}

$aqb_idne = '';

if ($abqrow[$i]['anti_bot_img'] != '')

{

$aqb_idne = '
' . $lang['ABQ_Image_DNE'] .
'';

if (!@is_dir(phpbb_realpath($phpbb_root_path . 'images/anti_bot/' . $abqrow[$i]['anti_bot_img'])))

{

unset($img_datendung);

$img_datendung = strtolower(preg_replace('/.*\.([a-z]+)$/','\1',$abqrow[$i]['anti_bot_img']));


if (($img_datendung == 'gif') || ($img_datendung == 'jpg') || ($img_datendung == 'jpeg') || ($img_datendung == 'png'))

{

$aqb_idne = '';

}

}

}

$template->assign_block_vars('abqrow', array(

'COLOR' => ($i % 2) ? 'row1' : 'row2',

'QUESTION' => $abqrow[$i]['question'],

'ANSWER' => $abq_aw,

'ANTI_BOT_IMG' => $abqrow[$i]['anti_bot_img'],

'IMG_NOTI' => $aqb_idne,

'LANGUAGE' => $abqrow[$i]['lang'],

'U_EDIT_ACTION' => append_sid('admin_anti_bot_quest.'.$phpEx.'?action=edit&id=' . $abqrow[$i]['id']),

'U_DELETE_ACTION' => append_sid('admin_anti_bot_quest.'.$phpEx.'?action=delete&id=' . $abqrow[$i]['id'])

)

);

}

}

else

{

$template->assign_block_vars('switch_no_questions', array());

$template->assign_vars(array(

'L_ABQ_NO_QUESTION' => $lang['ABQ_No_questions'])

);

}

$template->pparse('body');

include('./page_footer_admin.'.$phpEx);

}

else

{

if ($HTTP_GET_VARS['action'] == 'edit')

{

$script_path = $board_config['script_path'];

$server_name = trim($board_config['server_name']);

$server_protocol = ( $board_config['cookie_secure'] ) ? 'https://' : 'http://';

$server_port = ( $board_config['server_port'] <> 80 ) ? ':' . trim($board_config['server_port']) . '/' : '/';

$server_url = $server_name . $server_port . $script_path;

$server_url = $server_protocol . str_replace('//', '/', $server_url);

$abq_id = intval($HTTP_GET_VARS['id']);

$sql = 'SELECT *

FROM ' . ANTI_BOT_QUEST_TABLE . '

WHERE id = ' . $abq_id;

if(!$result = $db->sql_query($sql))

{

message_die(GENERAL_ERROR, 'Could not anti-bot-question information', '', __LINE__, __FILE__, $sql);

}

if( $db->sql_numrows($result) == 0 )

{

message_die(GENERAL_ERROR, 'The requested anti-bot-question does not exist');

}

$abqrow = $db->sql_fetchrow($result);


$template->set_filenames(array(

'body' => 'admin/anti_bot_quest_edit_body.tpl')

);
// Считываем загруженные изображения

$dir = @opendir($phpbb_root_path . 'images/anti_bot/');

while($file = @readdir($dir))

{

if (!@is_dir(phpbb_realpath($phpbb_root_path . 'images/anti_bot/' . $file)))

{

unset($img_datendung);

$img_datendung = strtolower(preg_replace('/.*\.([a-z]+)$/','\1',$file));

if (($img_datendung == 'gif') || ($img_datendung == 'jpg') || ($img_datendung == 'jpeg') || ($img_datendung == 'png'))

{

$anti_bot_images[] = $file;

}

}

}

@closedir($dir);

$filename_list = '';

for( $i = 0; $i < count($anti_bot_images); $i++ )

{

if ($anti_bot_images[$i] == $abqrow['anti_bot_img'])

{

$anti_bot_img_selected = ' selected="selected"';

}

else

{

$anti_bot_img_selected = "";

}

$filename_list .= '';

}

$abq_img = $phpbb_root_path . 'images/spacer.gif';

if ($abqrow['anti_bot_img'] != '')

{

$abq_img = $phpbb_root_path . 'images/anti_bot/' . $abqrow['anti_bot_img'];

}

$template->assign_vars(array(

'L_ABQ_TITLE' => $lang['ABQ_Admin_Title'],

'L_ABQ_EXPLAIN' => $lang['ABQ_Admin_Explain'],

'L_PANEL_TITLE' => $lang['ABQ_Edit_Question'],

'L_QUESTION' => $lang['ABQ_Question'],

'L_ANTI_BOT_IMG' => $lang['ABQ_ImageURL'],

'L_ANSWER' => $lang['ABQ_Answer'],

'L_ANSWER_EXPLAIN' => ($board_config['anti_bot_quest_casesen']) ? '
'.$lang['ABQ_Answer_Explain'] : '',


'L_HTML' => $lang['ABQ_Use_HTML'],

'L_HTML_EXPLAIN' => $lang['ABQ_Use_HTML_Explain'],

'L_YES' => $lang['Yes'],

'L_NO' => $lang['No'],

'L_BOARD_LANGUAGE' => $lang['Board_lang'],

'ANTI_BOT_IMG_OPTIONS' => $filename_list,

'S_ANTI_BOT_IMG_BASEDIR' => $phpbb_root_path . 'images/anti_bot/',

'S_ANTI_BOT_IMG_UP' => $phpbb_root_path . 'images/',

'S_ANTI_BOT_IMG' => $abq_img,

'S_HTML_NO_CHECKED' => (!$abqrow['use_html']) ? ' checked' : '',

'S_HTML_YES_CHECKED' => ($abqrow['use_html']) ? ' checked' : '',

'S_QUESTION' => $abqrow['question'],

'S_ANSWER1' => $abqrow['answer1'],

'S_ANSWER2' => $abqrow['answer2'],

'S_ANSWER3' => $abqrow['answer3'],

'S_ANSWER4' => $abqrow['answer4'],

'S_ANSWER5' => $abqrow['answer5'],

'S_MODE' => 'edit',

'S_LANGUAGE' => language_select($abqrow['lang'], 'language'),

'S_ABQ_VERSION' => $lang['ABQ_Version'],

'U_ABQ_ACTION' => append_sid('admin_anti_bot_quest.'.$phpEx.'?eid='.$abq_id))

);

$template->pparse('body');

include('./page_footer_admin.'.$phpEx);

}

elseif ($HTTP_GET_VARS['action'] == 'delete')

{

$script_path = $board_config['script_path'];

$server_name = trim($board_config['server_name']);

$server_protocol = ( $board_config['cookie_secure'] ) ? 'https://' : 'http://';

$server_port = ( $board_config['server_port'] <> 80 ) ? ':' . trim($board_config['server_port']) . '/' : '/';

$server_url = $server_name . $server_port . $script_path;

$server_url = $server_protocol . str_replace('//', '/', $server_url);

$abq_id = intval($HTTP_GET_VARS['id']);

$sql = 'SELECT *

FROM ' . ANTI_BOT_QUEST_TABLE . '

WHERE id = ' . $abq_id;

if(!$result = $db->sql_query($sql))

{

message_die(GENERAL_ERROR, 'Could not anti-bot-question information', '', __LINE__, __FILE__, $sql);

}

if( $db->sql_numrows($result) == 0 )

{

message_die(GENERAL_ERROR, 'The requested anti-bot-question does not exist');

}

$abqrow = $db->sql_fetchrow($result);

$template->set_filenames(array(

'body' => 'admin/anti_bot_quest_delete_body.tpl')

);

if (trim($abqrow['anti_bot_img']) != '')

{

$abq_img = '
';


}

else

{

$abq_img = '';

}

$template->assign_vars(array(

'L_ABQ_TITLE' => $lang['ABQ_Delete_Title'],

'L_ABQ_EXPLAIN' => $lang['ABQ_Admin_Explain'],

'L_PANEL_TITLE' => $lang['ABQ_Delete_Question'],

'L_QUESTION' => $lang['ABQ_Question'],

'L_ANTI_BOT_IMG' => $lang['ABQ_ImageURL'],

'L_ANSWER' => $lang['ABQ_Answer'],

'L_ANSWER_EXPLAIN' => ($board_config['anti_bot_quest_casesen']) ? '
'.$lang['ABQ_Answer_Explain'] : '',


'L_BOARD_LANGUAGE' => $lang['Board_lang'],

'ANTI_BOT_IMG' => $abq_img,

'S_QUESTION' => $abqrow['question'],

'S_ANSWER1' => $abqrow['answer1'],

'S_ANSWER2' => $abqrow['answer2'],

'S_ANSWER3' => $abqrow['answer3'],

'S_ANSWER4' => $abqrow['answer4'],

'S_ANSWER5' => $abqrow['answer5'],

'S_ANTI_BOT_IMG' => ($abqrow['anti_bot_img'] != '') ? $server_url.'images/anti_bot/'.$abqrow['anti_bot_img'] : '',

'S_LANGUAGE' => $abqrow['lang'],

'S_ABQ_VERSION' => $lang['ABQ_Version'],

'U_ABQ_ACTION' => append_sid('admin_anti_bot_quest.'.$phpEx.'?eid='.$abq_id))

);

$template->pparse('body');

include('./page_footer_admin.'.$phpEx);

}

}

}

else

{

if ($HTTP_POST_VARS['mode'] == 'new')

{

if (!isset($HTTP_POST_VARS['question']))

{

$template->set_filenames(array(

'body' => 'admin/anti_bot_quest_edit_body.tpl')

);

$script_path = $board_config['script_path'];

$server_name = trim($board_config['server_name']);

$server_protocol = ( $board_config['cookie_secure'] ) ? 'https://' : 'http://';

$server_port = ( $board_config['server_port'] <> 80 ) ? ':' . trim($board_config['server_port']) . '/' : '/';

$server_url = $server_name . $server_port . $script_path;

$server_url = $server_protocol . str_replace('//', '/', $server_url);


// Считываем загруженные изображения

$dir = @opendir($phpbb_root_path . 'images/anti_bot/');

while($file = @readdir($dir))

{

if (!@is_dir(phpbb_realpath($phpbb_root_path . 'images/anti_bot/' . $file)))

{

unset($img_datendung);

$img_datendung = strtolower(preg_replace('/.*\.([a-z]+)$/','\1',$file));

if (($img_datendung == 'gif') || ($img_datendung == 'jpg') || ($img_datendung == 'jpeg') || ($img_datendung == 'png'))

{

$anti_bot_images[] = $file;

}

}

}

@closedir($dir);

$filename_list = '';

for( $i = 0; $i < count($anti_bot_images); $i++ )

{

$filename_list .= '';

}

$template->assign_vars(array(

'L_ABQ_TITLE' => $lang['ABQ_Admin_Title'],

'L_ABQ_EXPLAIN' => $lang['ABQ_Admin_Explain'],

'L_PANEL_TITLE' => $lang['ABQ_Create_Question'],

'L_QUESTION' => $lang['ABQ_Question'],

'L_ANTI_BOT_IMG' => $lang['ABQ_ImageURL'],

'L_ANSWER' => $lang['ABQ_Answer'],

'L_ANSWER_EXPLAIN' => ($board_config['anti_bot_quest_casesen']) ? '
'.$lang['ABQ_Answer_Explain'] : '',


'L_HTML' => $lang['ABQ_Use_HTML'],

'L_HTML_EXPLAIN' => $lang['ABQ_Use_HTML_Explain'],

'L_YES' => $lang['Yes'],

'L_NO' => $lang['No'],

'L_BOARD_LANGUAGE' => $lang['Board_lang'],

'ANTI_BOT_IMG_OPTIONS' => $filename_list,

'S_ANTI_BOT_IMG_BASEDIR' => $phpbb_root_path . 'images/anti_bot/',

'S_ANTI_BOT_IMG_UP' => $phpbb_root_path . 'images/',

'S_ANTI_BOT_IMG' => $phpbb_root_path . 'images/spacer.gif',

'S_HTML_NO_CHECKED' => ' checked',

'S_HTML_YES_CHECKED' => '',

'S_QUESTION' => '',

'S_ANSWER1' => '',

'S_ANSWER2' => '',

'S_ANSWER3' => '',

'S_ANSWER4' => '',

'S_ANSWER5' => '',

'S_LANGUAGE' => language_select($board_config['default_lang'], 'language'),

'S_MODE' => 'new',

'S_ABQ_VERSION' => $lang['ABQ_Version'],

'U_ABQ_ACTION' => append_sid('admin_anti_bot_quest.'.$phpEx))

);

$template->pparse('body');

include('./page_footer_admin.'.$phpEx);

}

else

{

$ABQ_Error = '';

if (strlen($HTTP_POST_VARS['question']) > $ABQ_Question_Maxlenght)

{

$ABQ_Error .= sprintf($lang['ABQ_Question_too_long'], $ABQ_Question_Maxlenght) . '
';


}

if ((strlen($HTTP_POST_VARS['answer1']) > $ABQ_Answer_Maxlenght) || (strlen($HTTP_POST_VARS['answer2']) > $ABQ_Answer_Maxlenght) || (strlen($HTTP_POST_VARS['answer3']) > $ABQ_Answer_Maxlenght) || (strlen($HTTP_POST_VARS['answer4']) > $ABQ_Answer_Maxlenght) || (strlen($HTTP_POST_VARS['answer5']) > $ABQ_Answer_Maxlenght))

{

$ABQ_Error .= sprintf($lang['ABQ_Answer_too_long'], $ABQ_Answer_Maxlenght) . '
';


}

if ($HTTP_POST_VARS['usehtml'] == 'yes')

{

$abq_question = str_replace("\'", "''", trim($HTTP_POST_VARS['question']));

$abq_question = str_replace('

$abq_question = str_replace('


$abq_question = str_replace('

$abq_question = str_replace('


$abq_question = str_replace('', '<tr>', $abq_question);

$abq_question = str_replace('

$abq_question = str_replace('', '</tr>', $abq_question);

$abq_question = str_replace('', '<td>', $abq_question);

$abq_question = str_replace('

$abq_question = str_replace('', '</td>', $abq_question);

$abq_question = str_replace('', '<th>', $abq_question);

$abq_question = str_replace('

$abq_question = str_replace('', '</th>', $abq_question);

}

else

{

$abq_question = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['question'])));

}

$abq_answer1 = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['answer1'])));

$abq_answer2 = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['answer2'])));

$abq_answer3 = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['answer3'])));

$abq_answer4 = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['answer4'])));

$abq_answer5 = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['answer5'])));

$abq_anti_bot_img = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['anti_bot_img'])));

$abq_language = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['language'])));

if ($HTTP_POST_VARS['usehtml'] == 'yes')

{

$abq_use_html = 1;

}

else

{

$abq_use_html = 0;

}

if (empty($abq_question))

{

$ABQ_Error .= $lang['ABQ_Missed_Question'] . '
';


}

if ((!empty($abq_answer2)) && (empty($abq_answer1)))

{

$abq_answer1 = $abq_answer2;

$abq_answer2 = '';

}

if ((!empty($abq_answer3)) && ((empty($abq_answer1)) || (empty($abq_answer2))))

{

if (empty($abq_answer1))

{

$abq_answer1 = $abq_answer3;

$abq_answer3 = '';

}

elseif (empty($abq_answer2))

{

$abq_answer2 = $abq_answer3;

$abq_answer3 = '';

}

}

if ((!empty($abq_answer4)) && ((empty($abq_answer1)) || (empty($abq_answer2)) || (empty($abq_answer3))))

{

if (empty($abq_answer1))

{

$abq_answer1 = $abq_answer4;

$abq_answer4 = '';

}

elseif (empty($abq_answer2))

{

$abq_answer2 = $abq_answer4;

$abq_answer4 = '';

}

elseif (empty($abq_answer3))

{

$abq_answer3 = $abq_answer4;

$abq_answer4 = '';

}

}

if ((!empty($abq_answer5)) && ((empty($abq_answer1)) || (empty($abq_answer2)) || (empty($abq_answer3)) || (empty($abq_answer4))))

{

if (empty($abq_answer1))

{

$abq_answer1 = $abq_answer5;

$abq_answer5 = '';

}

elseif (empty($abq_answer2))

{

$abq_answer2 = $abq_answer5;

$abq_answer5 = '';

}

elseif (empty($abq_answer3))

{

$abq_answer3 = $abq_answer5;

$abq_answer5 = '';

}

elseif (empty($abq_answer4))

{

$abq_answer4 = $abq_answer5;

$abq_answer5 = '';

}

}

if (empty($abq_answer1))

{

$ABQ_Error .= $lang['ABQ_Missed_Answer'] . '
';


}

if (!empty($abq_anti_bot_img))

{

$abq_img_url = '../images/anti_bot/' . $abq_anti_bot_img;

if ((!file_exists($abq_img_url)) || (!filesize($abq_img_url)))

{

$ABQ_Error .= $lang['ABQ_No_Image'] . '
';


}

}


if (trim($ABQ_Error) != '')

{

message_die(GENERAL_ERROR, $lang['ABQ_not_updated'] . '

' .
$ABQ_Error);

}

$sql = 'INSERT INTO ' . ANTI_BOT_QUEST_TABLE . ' (question, answer1, answer2, answer3, answer4, answer5, anti_bot_img, lang, use_html)

VALUES (\'' . $abq_question . '\', \'' . $abq_answer1 . '\', \'' . $abq_answer2 . '\', \'' . $abq_answer3 . '\', \'' . $abq_answer4 . '\', \'' . $abq_answer5 . '\', \'' . $abq_anti_bot_img . '\', \'' . $abq_language . '\', \'' . $abq_use_html . '\')';

if(!$result = $db->sql_query($sql))

{

message_die(GENERAL_ERROR, 'Could not create new anti-bot-question', '', __LINE__, __FILE__, $sql);

}


$message = $lang['ABQ_New_Question_created'] . '

' . sprintf($lang['ABQ_Click_return_ABQ'], '', '') . '

' . sprintf($lang['Click_return_admin_index'], '
'">', '');
message_die(GENERAL_MESSAGE, $message);

}

}

elseif ($HTTP_POST_VARS['mode'] == 'edit')

{

$abq_id = intval($HTTP_GET_VARS['eid']);

$ABQ_Error = '';

if (strlen($HTTP_POST_VARS['question']) > $ABQ_Question_Maxlenght)

{

$ABQ_Error .= sprintf($lang['ABQ_Question_too_long'], $ABQ_Question_Maxlenght) . '
';


}

if ((strlen($HTTP_POST_VARS['answer1']) > $ABQ_Answer_Maxlenght) || (strlen($HTTP_POST_VARS['answer2']) > $ABQ_Answer_Maxlenght) || (strlen($HTTP_POST_VARS['answer3']) > $ABQ_Answer_Maxlenght) || (strlen($HTTP_POST_VARS['answer4']) > $ABQ_Answer_Maxlenght) || (strlen($HTTP_POST_VARS['answer5']) > $ABQ_Answer_Maxlenght))

{

$ABQ_Error .= sprintf($lang['ABQ_Answer_too_long'], $ABQ_Answer_Maxlenght) . '
';


}

if ($HTTP_POST_VARS['usehtml'] == 'yes')

{

$abq_question = str_replace("\'", "''", trim($HTTP_POST_VARS['question']));

$abq_question = str_replace('

$abq_question = str_replace('


$abq_question = str_replace('

$abq_question = str_replace('


$abq_question = str_replace('', '<tr>', $abq_question);

$abq_question = str_replace('

$abq_question = str_replace('', '</tr>', $abq_question);

$abq_question = str_replace('', '<td>', $abq_question);

$abq_question = str_replace('

$abq_question = str_replace('', '</td>', $abq_question);

$abq_question = str_replace('', '<th>', $abq_question);

$abq_question = str_replace('

$abq_question = str_replace('', '</th>', $abq_question);

}

else

{

$abq_question = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['question'])));

}

$abq_answer1 = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['answer1'])));

$abq_answer2 = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['answer2'])));

$abq_answer3 = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['answer3'])));

$abq_answer4 = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['answer4'])));

$abq_answer5 = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['answer5'])));

$abq_anti_bot_img = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['anti_bot_img'])));

$abq_language = str_replace("\'", "''", htmlspecialchars(trim($HTTP_POST_VARS['language'])));

if ($HTTP_POST_VARS['usehtml'] == 'yes')

{

$abq_use_html = 1;

}

else

{

$abq_use_html = 0;

}

if (empty($abq_question))

{

$ABQ_Error .= $lang['ABQ_Missed_Question'] . '
';


}

if ((!empty($abq_answer2)) && (empty($abq_answer1)))

{

$abq_answer1 = $abq_answer2;

$abq_answer2 = '';

}

if ((!empty($abq_answer3)) && ((empty($abq_answer1)) || (empty($abq_answer2))))

{

if (empty($abq_answer1))

{

$abq_answer1 = $abq_answer3;

$abq_answer3 = '';

}

elseif (empty($abq_answer2))

{

$abq_answer2 = $abq_answer3;

$abq_answer3 = '';

}

}

if ((!empty($abq_answer4)) && ((empty($abq_answer1)) || (empty($abq_answer2)) || (empty($abq_answer3))))

{

if (empty($abq_answer1))

{

$abq_answer1 = $abq_answer4;

$abq_answer4 = '';

}

elseif (empty($abq_answer2))

{

$abq_answer2 = $abq_answer4;

$abq_answer4 = '';

}

elseif (empty($abq_answer3))

{

$abq_answer3 = $abq_answer4;

$abq_answer4 = '';

}

}

if ((!empty($abq_answer5)) && ((empty($abq_answer1)) || (empty($abq_answer2)) || (empty($abq_answer3)) || (empty($abq_answer4))))

{

if (empty($abq_answer1))

{

$abq_answer1 = $abq_answer5;

$abq_answer5 = '';

}

elseif (empty($abq_answer2))

{

$abq_answer2 = $abq_answer5;

$abq_answer5 = '';

}

elseif (empty($abq_answer3))

{

$abq_answer3 = $abq_answer5;

$abq_answer5 = '';

}

elseif (empty($abq_answer4))

{

$abq_answer4 = $abq_answer5;

$abq_answer5 = '';

}

}

if (empty($abq_answer1))

{

$ABQ_Error .= $lang['ABQ_Missed_Answer'] . '
';


}

if (!empty($abq_anti_bot_img))

{

$abq_img_url = '../images/anti_bot/' . $abq_anti_bot_img;

if ((!file_exists($abq_img_url)) || (!filesize($abq_img_url)))

{

$ABQ_Error .= $lang['ABQ_No_Image'] . '
';


}

}


if (trim($ABQ_Error) != '')

{

message_die(GENERAL_ERROR, $lang['ABQ_not_updated'] . '

' .
$ABQ_Error);

}

$sql = 'UPDATE ' . ANTI_BOT_QUEST_TABLE . '

SET question = \'' . $abq_question . '\',

answer1 = \'' . $abq_answer1 . '\',

answer2 = \'' . $abq_answer2 . '\',

answer3 = \'' . $abq_answer3 . '\',

answer4 = \'' . $abq_answer4 . '\',

answer5 = \'' . $abq_answer5 . '\',

anti_bot_img = \'' . $abq_anti_bot_img . '\',

lang = \'' . $abq_language . '\',

use_html = \'' . $abq_use_html . '\'

WHERE id = ' . $abq_id;

if(!$result = $db->sql_query($sql))

{

message_die(GENERAL_ERROR, 'Could not update this anti-bot-question', '', __LINE__, __FILE__, $sql);

}


$message = $lang['ABQ_Question_updated'] . '

' . sprintf($lang['ABQ_Click_return_ABQ'], '', '') . '

' . sprintf($lang['Click_return_admin_index'], '
'">', '');
message_die(GENERAL_MESSAGE, $message);

}

elseif ($HTTP_POST_VARS['mode'] == 'delete')

{

$abq_id = intval($HTTP_GET_VARS['eid']);

$sql = 'DELETE FROM ' . ANTI_BOT_QUEST_TABLE . '

WHERE id = ' . $abq_id;

if(!$result = $db->sql_query($sql))

{

message_die(GENERAL_ERROR, 'Could not delete this anti-bot-question', '', __LINE__, __FILE__, $sql);

}


$message = $lang['ABQ_Question_deleted'] . '

' . sprintf($lang['ABQ_Click_return_ABQ'], '', '') . '

' . sprintf($lang['Click_return_admin_index'], '
'">', '');
message_die(GENERAL_MESSAGE, $message);

}

}

?>

  1. Листинг файла db_update.php



/***************************************************************************

* db_update.php

* ---------------

**************************************************************************/

define('IN_PHPBB', true);

$phpbb_root_path = './';

$i = 0;

while ( !file_exists($phpbb_root_path . 'extension.inc') && ($i++ < 4) )

{

$phpbb_root_path .= '../';

}

if ( $i > 4 )

{

message_die(GENERAL_MESSAGE, 'Unable to find extension.inc, terminating. Please move this file into your main/"root" phpbb directory and try again.');

}

include($phpbb_root_path . 'extension.inc');

include($phpbb_root_path . 'common.'.$phpEx);

//

// Start session management

//

$userdata = session_pagestart($user_ip, PAGE_INDEX);

init_userprefs($userdata);

//

// End session management

//

if( !$userdata['session_logged_in'] )

{

redirect(append_sid("login.$phpEx?redirect=db_update.$phpEx", true));

}

if( $userdata['user_level'] != ADMIN )

{

message_die(GENERAL_MESSAGE, 'You are not authorised to access this page');

}

$page_title = 'Installing Anti-Bot-Question Tables';

include($phpbb_root_path . 'includes/page_header.'.$phpEx);

print<<



























Updating the database






    DELIM;

    $current_time = time();

    switch ( SQL_LAYER )

    {

    case 'msaccess':

    break;

    case 'postgresql':

    $sql = array(

    "CREATE SEQUENCE {$table_prefix}anti_bot_quest_id_seq start 31 increment 1 maxvalue 2147483647 minvalue 1 cache 1;",

    "CREATE TABLE {$table_prefix}anti_bot_quest (

    id int DEFAULT nextval('{$table_prefix}anti_bot_quest_id_seq'::text) NOT NULL,

    question text NOT NULL,

    answer1 varchar(255) DEFAULT '' NOT NULL,

    answer2 varchar(255) DEFAULT '' NOT NULL,

    answer3 varchar(255) DEFAULT '' NOT NULL,

    answer4 varchar(255) DEFAULT '' NOT NULL,

    answer5 varchar(255) DEFAULT '' NOT NULL,

    anti_bot_img varchar(255) DEFAULT '' NOT NULL,

    lang varchar(255) DEFAULT '' NOT NULL,

    use_html char(1) DEFAULT '0' NOT NULL,

    CONSTRAINT {$table_prefix}anti_bot_quest_pkey PRIMARY KEY (id)

    );",



    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'What of these four is an planet?
    America, Cat, Earth, University', 'Earth', '', '', '', '', '', 'english', '1');",


    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'What of these four is an animal?
    Car, Europe, Horse, Mountain', 'Horse', '', '', '', '', '', 'english', '1');",


    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'What is the result of three multiplied by three? (Do not use numbers in your answer. e.g. If the result is 5, then write five.)', 'nine', 'Nine', '', '', '', '', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'Shows the picture fire? Yes or no', 'Yes', 'yes', '', '', '', 'example2.jpg', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'What kind of fruit is shown on the picture?', 'Appel', 'appel', '', '', '', 'example5.jpg', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'Can you see an airplane on the photo?', 'No', 'no', '', 'example2.jpg', '', '', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'How many blue lines can you count on the image?', '4', 'four', 'Four', '', '', 'example3.gif', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'How many red lines can you see on the image?', '5', 'five', 'Five', '', '', 'example3.gif', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'What is the result of...', '5', 'five', 'Five', '', '', 'example4.jpg', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'How many arrows can you find?', '6', 'six', 'Six', '', '', 'example1.jpg', 'english', '0');"

    );



    break;

    case 'mysql':

    case 'mysql4':

    default:

    $sql = array(

    "CREATE TABLE {$table_prefix}anti_bot_quest (

    id mediumint(8) NOT NULL auto_increment,

    question text NOT NULL,

    answer1 varchar(255) NOT NULL default '',

    answer2 varchar(255) NOT NULL default '',

    answer3 varchar(255) NOT NULL default '',

    answer4 varchar(255) NOT NULL default '',

    answer5 varchar(255) NOT NULL default '',

    anti_bot_img varchar(255) NOT NULL default '',

    lang varchar(255) NOT NULL default '',

    use_html CHAR( 1 ) DEFAULT '0' NOT NULL,

    PRIMARY KEY (id)

    ) TYPE=MyISAM AUTO_INCREMENT=1;",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'What of these four is an planet?
    America, Cat, Earth, University', 'Earth', '', '', '', '', '', 'english', '1');",


    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'What of these four is an animal?
    Car, Europe, Horse, Mountain', 'Horse', '', '', '', '', '', 'english', '1');",


    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'What is the result of three multiplied by three? (Do not use numbers in your answer. e.g. If the result is 5, then write five.)', 'nine', 'Nine', '', '', '', '', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'Shows the picture fire? Yes or no', 'Yes', 'yes', '', '', '', 'example2.jpg', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'What kind of fruit is shown on the picture?', 'Appel', 'appel', '', '', '', 'example5.jpg', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'Can you see an airplane on the photo?', 'No', 'no', '', 'example2.jpg', '', '', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'How many blue lines can you count on the image?', '4', 'four', 'Four', '', '', 'example3.gif', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'How many red lines can you see on the image?', '5', 'five', 'Five', '', '', 'example3.gif', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'What is the result of...', '5', 'five', 'Five', '', '', 'example4.jpg', 'english', '0');",

    "INSERT INTO {$table_prefix}anti_bot_quest VALUES ('', 'How many arrows can you find?', '6', 'six', 'Six', '', '', 'example1.jpg', 'english', '0');"

    );

    break;

    }

    foreach ( $sql AS $query )

    {

    if ( !($result = $db->sql_query($query)) )

    {

    $error = $db->sql_error();

    print('
  • ' . nl2br($query) . '
    +++ Error: ' .
    $error['message'] . '

  • ');


    }

    else

    {

    print('
  • ' . nl2br($query) . '
    +++ Successfull

  • ');


    }

    }


    $forum_url = append_sid($phpbb_root_path . "index.$phpEx");

    print<<





 
Finished



























SQL Installation complete


Please delete this file (db_update.{$phpEx}).


If you have any problems, please visit {$phpbb_url} and ask for help.



Click Here to return to your forum.





DELIM;

include($phpbb_root_path . 'includes/page_tail.'.$phpEx);


?>

  1. Листинг файла anti_bot_config_body.tpl

{L_CONFIGURATION_TITLE}




{L_CONFIGURATION_EXPLAIN}
























































{L_GENERAL_SETTINGS}
{L_ANTI_BOT_QUEST}
{L_ANTI_BOT_QUEST_EXPLAIN}{L_ANTI_BOT_QUEST_CONFIRM}
{L_YES}   {L_NO}
{L_ANTI_BOT_QUEST_GUEST}
{L_ANTI_BOT_QUEST_GUEST_EXPLAIN}
{L_YES}   {L_NO}
{L_ANTI_BOT_QUEST_CASESEN} {L_YES}   {L_NO}
{L_ANTI_BOT_QUEST_BILD}
{L_ANTI_BOT_QUEST_BILD_EXPLAIN}
{L_YES}   {L_NO}
{L_ANTI_BOT_QUEST_VARNAME}
{L_ANTI_BOT_QUEST_VARNAME_EXPLAIN}
  






  1. Листинг файла anti_bot_quest_body.tpl

{L_ABQ_TITLE}




{L_ABQ_EXPLAIN}






























































{L_ABQ_TITLE} {L_ABQ_IMAGE} {L_ABQ_ANSWER} {L_BOARD_LANGUAGE} {L_ACTION}
{L_ABQ_NO_QUESTION}
{abqrow.QUESTION} {abqrow.ANTI_BOT_IMG}{abqrow.IMG_NOTI} {abqrow.ANSWER} {abqrow.LANGUAGE} {L_EDIT} {L_DELETE}







  1. Листинг файла anti_bot_quest_delete_body.tpl

{L_ABQ_TITLE}




{L_ABQ_EXPLAIN}


















































































{L_PANEL_TITLE}
{L_QUESTION}: {S_QUESTION}
{L_ANTI_BOT_IMG}: https://bukvasha.net/images/nopicture.png{ANTI_BOT_IMG}
{L_ANSWER} 1:{L_ANSWER_EXPLAIN} {S_ANSWER1}
{L_ANSWER} 2:{L_ANSWER_EXPLAIN} {S_ANSWER2}
{L_ANSWER} 3:{L_ANSWER_EXPLAIN} {S_ANSWER3}
{L_ANSWER} 4:{L_ANSWER_EXPLAIN} {S_ANSWER4}
{L_ANSWER} 5:{L_ANSWER_EXPLAIN} {S_ANSWER5}
{L_BOARD_LANGUAGE}: {S_LANGUAGE}







  1. Листинг файла anti_bot_quest_edit_body.tpl

{L_ABQ_TITLE}




{L_ABQ_EXPLAIN}




























































































{L_PANEL_TITLE}
{L_QUESTION}:
{L_HTML}: {L_NO}   {L_YES}
{L_HTML_EXPLAIN}
{L_ANTI_BOT_IMG}:


{L_ANSWER} 1:{L_ANSWER_EXPLAIN}
{L_ANSWER} 2:{L_ANSWER_EXPLAIN}
{L_ANSWER} 3:{L_ANSWER_EXPLAIN}
{L_ANSWER} 4:{L_ANSWER_EXPLAIN}
{L_ANSWER} 5:{L_ANSWER_EXPLAIN}
{L_BOARD_LANGUAGE}: {S_LANGUAGE}






1. Реферат Современный расизм как глобальная проблема
2. Диплом на тему Полномочия и процессуальная самостоятельность следователя
3. Реферат на тему Mandating To Wear Seatbelts Essay Research Paper
4. Реферат Системный анализ и управление логистическими системами
5. Реферат Единая автоматизированная информационная система ЕАИС таможенных органов России
6. Реферат Отечественная психология личности
7. Статья на тему Понятийный аппарат при исследовании инвестиционных процессов
8. Реферат на тему Lyme Essay Research Paper Lyme DiseaseLyme ArthritisLyme
9. Реферат на тему How To Keep Your Car Running Like
10. Реферат на тему Internet Micropayments Essay Research Paper Internet Micropayments