Автоматическое выполнение тестов (автозаполнение)

Автоматическое выполнение тестов (автозаполнение)

от Konstantin Udovichenko -
Количество ответов: 26
Добрый день, используем Moodle 1.9.0, обнаружили интересную особенность. Пользователи научились выполнять тесты используя некую автоматизированную систему.

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

Из собственных мыслей, программа или скрипт привязывается к значению id checkbox'ов (благо отследить какой из них соответствует какому вопросу и ответу легко), после чего у нужных checkbox'ов меняется значение checked на true и форма субмитится.

Второй вариант, это автоматическая передача нужных данных методом POST на скрипт attempt.php.

Из всего вышеизложенного выплывает, что бороться с этим нужно путем рандомизации ID, но это существенные изменения в модуль QUIZ. Возможно кто-то сталкивался с подобным и уже есть решения?
В ответ на Konstantin Udovichenko

Re: Автоматическое выполнение тестов (автозаполнение)

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода
Да. Для этого даже не обязательно супер программу писать. Достаточно что-то типа userJavascript - такой есть в опере и в firefox.
Я когда изучал структуру модуля сразу думал об этом. Мы когда составляли тесты всегда первым ответом указывали правильный, а потом остальные. Таким образом при импорте в базу у правильного всегда получался наименьший id. Возможно и у Вас также. В этом случае, опять же, достаточно написать программу на userjavascript. Проблема до сих пор открыта, но мы используем тесты пока только в дневном образовании и поэтому нам удаётся смотреть за студентами во время сдачи. У нас из серьёзных проколов было только когда студенты подсмотрели пароль преподавателя, заходили под ним на соседнем компьютере и смотрели ответы на тест. Решилось сменой пароля.

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

По сути для защиты нужно делать именно так, как Вы говорите. Создавать дополнительную таблицу-прослойку, которая будет хранить случайные id вопросов и ответов на время теста и соответствующие им постоянные id. Но это требует существенных изменений в коде. По хорошему об этом следует написать в moodle-tracker в разделе security. Раздобыть бы больше информации о том принципе, по которому осущетсвляется атака...

Из резервных вариантов могу предложить следущее. Нужно написать скрипт, который будет менять местами id правильного ответа с одним из неправильных. Однако при этом придётся менять его во всех таблицах, которые на него ссылаются, но таких не очень много. И запускать этот скрипт по cron раз в день.

Опять же, если студенты ведут базу ваших вопросов, то они будут отвечать хорошо даже при всех видах технической защиты, только чуть подольше. Тут выход только в том, чтобы увеличивать число вопросов в базе.
В ответ на Vadim Dvorovenko

Re: Автоматическое выполнение тестов (автозаполнение)

от Konstantin Udovichenko -
Вопросы выбираются случайным образом, ответы мешаются... при занесении в базу правильные ответы были в разных местах, не всегда первые. Утечка правильных ответов возможно, но, с другой стороны, при наличии времени и желания, можно пройти тест и "подобрать" правильный ответ, а если при этом учебной литературой воспользоваться. улыбаюсь В любом случае, получить ID вопроса и ID правильного ответа не такая проблема.

Касательно javascript, пробовал, нужный скрипт пишется за 5 минут (а то и быстрее), правда моя версия с первого раза не заработала и выдала "доступ запрещен", но, думаю, это обходится настройками безопасности браузера... в этом направлении я еще ковыряюсь.

В плане борьбы, наверное лучше не создавать дополнительную нагрузку на сервер базы данных, а встроить в QUIZ модуль шифрования, а лучше хэширования, по аналогии с кодированием пароля в phpBB3, когда слово в закодированном виде все время отображается по разному.

В moodle-tracker написать не могу, не достаточно зананий английского, для нормального описания проблемы. грущу

Увеличение количество вопросов в банке, это всегда правильный шаг. улыбаюсь
В ответ на Konstantin Udovichenko

Re: Автоматическое выполнение тестов (автозаполнение)

от Dmitry Pupinin -
Технические возможности противодействия искать нужно, но когда у вас есть доказательства подлога со стороны вполне конкретных людей, то тут нужно просто включать административный ресурс и разбираться с ними вплоть до отчисления.
Чтобы не быть отчисленными они вам и скрипты отдадут и програмера сдадут... подмигиваю Програмера берете на работу, отстальным строгач с занесением. Думаю после этого на некоторое время вы забудите об этой проблеме...
В ответ на Konstantin Udovichenko

Re: Автоматическое выполнение тестов (автозаполнение)

от Artem Andreev -
Изображение пользователя Эксперт по Moodle
Как понимаю, даже решение подобной технической проблемы, ни к чему особо не приведет: для того чтобы состряпать такое техническое решение, надо уже иметь бумажное - правильные ответы по всем вопросам. Даже если Вы отсекете техническую сдачу теста, по шпаргалке все равно сдать не проблема.
В ответ на Artem Andreev

Re: Автоматическое выполнение тестов (автозаполнение)

от Konstantin Udovichenko -
Приведет к исключению технического подбора ответа... работа со шпаргалкой, это нормально... но когда несколько групп проходит тест одинаково, с одинаковыми результатами и затратой времени в 20 секунд, это совсем не вариант... впрочем, вопрос "наличия ответов" решается увеличением количества вопросов в банке, да, в обоих случаях с увеличением вопросов увеличивается и база ответов... но в случае автоматического проставления, никаких остаточных знаний у студента не остается, а в случае самостоятельного поиска вопроса в списке - есть шанс (пусть и призрачный).

В общем остается открытым вопрос... кто-нибудь занимался вопросом шифрования ID значений в модуле QUIZ или брать блокнот и начинать ковырять самостоятельно?
В ответ на Konstantin Udovichenko

Re: Автоматическое выполнение тестов (автозаполнение)

от Dmitry Pupinin -
Начать поиск нужно ессно с английской части сайта...

Ну а в целом решение может быть таким:
Берем нечто из БД различное для разных студентов, наилучшим мне видится время начала попытки (id студента легко поломается), присоединяем к текущему имени элемента (или просто к id ответа) и хэшируем. К хэшу можно добавить номер вопроса, ибо потом нужно будет как-то со всем этим разобраться... подмигиваю Номер вопроса ничего студенту не даст, т.к. хэши все-равно у всех будут разные.

ЗЫ: Пока писал подумал вот о чем: так же как жабаскрипт может находить id элементов, он может искать и содержимое тегов, тобишь сами ответы. Другими словами скрипт ищет текст правильного ответа и ставит напротив галочку, точечку и т.п. Конечно он должен будет учитывать и текст вопроса, чтобы отсечь одинаковые ответы в разных вопросах. Вот с этим вам будет очень трудно что-то сделать... подмигиваю
В ответ на Dmitry Pupinin

Re: Автоматическое выполнение тестов (автозаполнение)

от Konstantin Udovichenko -
Да, мысль о хэшировании это самый очевидный вариант (что-то мне опдсказыает, что единственный), касательно поиска пол тексту лейблов - вторая. улыбаюсь Однако можно подменить русские буквы на английские автозаменой в базе данных, местами вставить картинки (что не всегда правильно, но тоже вариант), а некоторые символы можно вообще кодом указать. Получится такая солянка, что некоторым программе будет проблематично в этом разобраться.

Второй вариант, но тут мои знания чисто теоритические, это переработка QUIZ модуля на FLAS...
В ответ на Konstantin Udovichenko

Re: Автоматическое выполнение тестов (автозаполнение)

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода
Ну лучше перерабатывать не на flash, а на ajax. От этого бы всем было бы приятно, но это полгода можно потратить на такой подвиг.
Вопросы безопасности тут конечно ни при чём, ибо всё, что можно увидеть глазами бесполезно защищать от копирования. Другое дело id вопросов и ответов. Посмотрел структуру теста в moodle - проблема усугубляется ещё и тем, что выпавшие варианты вопросов хранятся не в отдельной таблице построчно - тогда можно было бы использовать id из этой таблицы и он бы всегда получался новым. Они хранятся в поле layout просто через запятую и в этом конкретный архитектурный косяк ибо сортировочная работа перевешвается с базы данных на php. С хэшированием тоже вариант не идеальный, потому что всё-равно потребует промежуточной таблицы для хранения нехэшированных данных. А портить текст вопроса всяким мусором мне кажется ещё более ужасная идея.

У меня все-таки предложение следущее - сначала пишем эксплойт на javascript. У него должно быть два режима работы - первый - всегда выбирать наименьший id их группы и второй - работа по массиву в котором по номеру вопроса поставлен номер правильного ответа. Потому публикуем эксплойт на трэкере и смотрим реакцию общественности. Правда в ява-скрипте я не помошник, а вот на трэкер напишу.

Только просьба - эксплойт в общий доступ не класть. Либо в личку, либо в общак под паролем, а пароль в личку.
В ответ на Vadim Dvorovenko

Re: Автоматическое выполнение тестов (автозаполнение)

от Dmitry Pupinin -
Можно не делать таблицу для хешей, ибо ответов в вопросе немного, их id известны, так что перебрать не составит труда. Это конечно доп.нагрузка, но и с таблицей есть вопросы, например ее чистка...
В ответ на Dmitry Pupinin

Re: Автоматическое выполнение тестов (автозаполнение)

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
плохо дело. У любого вопроса и любого ответа всегда один и тот же ID
вне зависимости от того кто сдает! Достаточно 1 раз правильно ответить.

Для автоматизации ничего писать даже не нужно - есть плагины для автозаполнения форм!

Кроме увеличения числа вопросов в базе неплохо бы еще и противодействовать возможности автоматизации входа в систему изменить генерацию ID.

Нужно логин с CAPTCHA сделать улыбаюсь

Сейчас автоматизировать вход на moodle крайне легко. Пароль передается в открытом виде в обычной форме. JMeter-ом автоматизировать вход в систему было совсем просто. При поголовном использовании javascript передавать не пароль, а его хеш совсем не трудно, но затруднило бы автоматизацию входа в систему.

Изменить генерацию ID не так сложно - число вопросов и ответов не велико ремап можно в сессию запихнуть. Нужно будет поковырять код. Возможно это будет не так сложно.
В ответ на Виталий Лавров

Re: Автоматическое выполнение тестов (автозаполнение)

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода
Давайте сначала эксплойт сделаем, чтобы было, с чего на трэкере разговор начать. То есть любое решение, которое позволило бы легко тиражировать наборы правильных ответов между РАЗНЫМИ машинами.
Проблема, как я понимаю, не в том, что студент автоматически логинится, а в том, что он получает от другого студента таблицу вопрос-ответ и по ней заполняет ответы, да ещё и автоматически.
То есть если бы он получал вопросы и ответы в человекочитаемом виде, то в процессе поиска правильного ответа он может быть что-то и запоминал бы улыбаюсь

Плюс нынешнего состояния тестовой системы moodle в том, что для большинства задач javascript пока не требуется, а для кого-то это актуально.
Проблема усугубляется ещё тем, что в moodle20 модуль тестов существенно переработан, хотя данная проблема там не решена.
Поэтому до опубликования задачи на трэкере и консультаций с гуру не стоит слишком глубоко ковырять код.

Ремап вопросов не должен быть привязан к сессии. Он должен быть привязат к конкретной попытке сдачи, то есть к таблице quiz_attempts. Плюс решение должно быть универсальным и позволять делать тесты хоть в тысячу вопросов.
В ответ на Vadim Dvorovenko

Re: Автоматическое выполнение тестов (автозаполнение)

от Artem Andreev -
Изображение пользователя Эксперт по Moodle
>> То есть если бы он получал вопросы и ответы в человекочитаемом виде, то в процессе поиска правильного ответа он может быть что-то и запоминал бы

Вы серьезно в это верите? улыбаюсь По-моему, самообман.
Практически непреодолимые варианты:
- за магарыч один товарищ садится и максимум за час проходит всем тест. Без технической автоматизации. С ней проходит гораздо быстрее. Но настолько ли это важно? улыбаюсь
- шпаргалка в ворде - человек сам сидит и вооружившись поиском проставляет ответы: фига с два, что у него после этого механического процесса в голове что-нибудь останется (по-крайней мере будет стремиться к нулю) улыбаюсь

На мой взгляд, тут надо больше об организационной стороне вопроса задумываться.

Но что ответит Тим Хант и другие все же очень интересно улыбаюсь
Как один из вариантов:
1. Ставим Portable Mozilla Firefox.
2. На него ставим плагин Autofill Forms: https://addons.mozilla.org/en-US/firefox/addon/4775
3. В настройках создаем чистый новый профиль с названием теста.
4. При выполнении теста включаем Отображение подробностей форм (правой кнопкой в любом месте страницы)
5. Для коротких ответов: правой кнопкой на поле, Add an autofill Forms rule for this fild... Дальше несложно разобраться.
Для множественного выбора в качестве значения необходимо указать value.
С остальными типами тоже, наверное, несложно будет разобраться. Хотя, вообще интересно насчет аяксовых пертаскиваний, упорядочиваний и т.п. И с вычисляемым посложнее, возможно даже этим решением особо не обойдешься.
6. Потом этот Portable раздаем всем кому надо. Им надой зайти в тест, щелкнуть правой кнопкой в любом месте, выбрать Autofill forms и соответствующий профиль.

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

Я думаю это один из самых простых вариантов. Можно и других понапридумывать разной степени сложности.

Сам плагин я реально опробовал на тесте. Всю схему с Portable немного натеоретизировал, но вроде проблем особых не видно.

С направлением русский -> английский у меня не очень. Сам баг пока постить не буду. Как кто-нить запостит, сюда ссылку киньте. Если до ВС никто не сделает, может попрошу товарища описать все это на грамотном анлгийском. Кстати, может лучше и не в трекер писать, а на форум...
В ответ на Artem Andreev

Re: Автоматическое выполнение тестов (автозаполнение)

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
IMHO для борьбы с таким злом достаточно прибавлять к ID ответа случайную величину:
к первому ответу прибавляем Х1, ко второму ответу Х2 и т.д.
Значения X1...XN генерить при начале теста и записывать в сессию.
У нас всего 10 возможных ответов на вопрос, так что объем данных в сессии увеличится незначительно.

Можно вообще тупо генерировать 10 случайных чисел после логина юзера и записывать их в сессию
и далее использовать при генерации формы в тестах.
В ответ на Виталий Лавров

Re: Автоматическое выполнение тестов (автозаполнение)

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
Патчик получился совсем скромный для вопросов типа множественного выбора.

Думаю для truefalse будет не очень сложно
В ответ на Виталий Лавров

Re: Автоматическое выполнение тестов (автозаполнение)

от Alexandre Scherbyna -
Господа, разрешите и дилетанту задать вам вопрос. Дело в том, что во время всей вашей дискуссии никто даже не вспомнил о тестировании в защищенном окне. А я то по наивности полагал, что разные автозаполнения и прочие нехорошие вещи там отключаются. Если это не так, то может решение проблемы нужно искать как раз в совершенствовании этого самого защищенного окна?
В ответ на Alexandre Scherbyna

Re: Автоматическое выполнение тестов (автозаполнение)

от Artem Andreev -
Изображение пользователя Эксперт по Moodle
А потом учащийся выключает javascript в своем браузере и тю-тю приплыли. Хотя может против каких-то конкретных вариантов технического читинга и поможет...
В ответ на Alexandre Scherbyna

Re: Автоматическое выполнение тестов (автозаполнение)

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода
Защищённое окно не запрещает просмотр исходного кода, например в Opera и userjavascript там же. Вообще, Opera очень противная штука для любителей изобретать средства защиты.
Всё-таки основная идея в том, что ученик должен получать текст вопроса, но никогда не должен получать его id, и если эта задача не реализуется, то толку от такой защиты мало, если реализуется любым способом, то она уже хороша.
В ответ на Vadim Dvorovenko

Re: Автоматическое выполнение тестов (автозаполнение)

от Dmitry Pupinin -
id вопроса ничего не даст учащемуся. Он не должен видить id ответов.
В ответ на Dmitry Pupinin

Re: Автоматическое выполнение тестов (автозаполнение)

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода
При желании и эта информация может быть использована с толком.
Пример: в базе тысяча вопросов. Я делаю распечатку в которой все известные мне вопросы и правильные ответы. Поиск нужного вопроса по тексту в этой распечатке занимает несколько минут. Если мне известны id вопроса, то я сортирую распечатку по id и поиск вопроса занимает несколько секунд.
Тут нужно быть последовательным до конца, чтобы ни id вопросов, ни ответов
В ответ на Vadim Dvorovenko

Re: Автоматическое выполнение тестов (автозаполнение)

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
Значит так же добавлять случайную величину как и к ID ответа.
Число случайных чисел для вопросов можно ограничить каким-нубудь разумным числом (типа 64).
Если число вопросов больше 64 то идти сначала.

Кто-нибудь взглянул на патчик ?
В ответ на Artem Andreev

Re: Автоматическое выполнение тестов (автозаполнение)

от Artem Andreev -
Изображение пользователя Эксперт по Moodle
Все же попросил нашего сотрудника задать этот вопрос в Using Moodle. Я ожидал подобного направления реакции, но "сила" превзошла мои ожидания улыбаюсь

http://moodle.org/mod/forum/discuss.php?d=127373
В ответ на Artem Andreev

Re: Автоматическое выполнение тестов (автозаполнение)

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
ну патчик для рандомизации ID ответов я у себя применил. Судя по отсутствию жалоб - работает правильно.
Смысл патчика прост - при логине создается массив случайных величин.
при генерации формы и ID ответа прибавляется эта случайная величина и автозаполнение по id формы уже не должно работать.
Ну и для варианта когда первый ответ правильный тоже помогает.

В ответ на Виталий Лавров

Re: Автоматическое выполнение тестов (автозаполнение)

от Farrukh LL -

Можете подсказать куда и как внедрить Ваш 01rnd_answ-2.diff и работает ли?

В ответ на Farrukh LL

Re: Автоматическое выполнение тестов (автозаполнение)

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
Вы почти на 10 лет опоздали улыбаюсь
Сейчас этот патч не актуален.
В ответ на Виталий Лавров

Re: Автоматическое выполнение тестов (автозаполнение)

от Farrukh LL -
А что случилось:-)



ср, 26 июн. 2019 г., 12:29 Виталий Лавров (отправлено через moodle.org) <
В ответ на Farrukh LL

Re: Автоматическое выполнение тестов (автозаполнение)

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
да как бы moodle-1.9 уже помер.
Да и средства автозаполнения стали более "умными". Случайные id вопросов/ответов их уже не смущают.