Я делаю простое приложение для тренировки умственной математики в https://mattea.app/. Это соревнование на время, и я измеряю время, которое вы тратите на выполнение 10 упражнений.
Упражнения выполняются на сервере — в функции Node.js, обслуживаемой через облачные функции Google Firebase.
Одна из проблем заключается в том, что пользователи могут обманывать, создавая скрипт, который читает упражнения, а затем программно вычисляет и очень быстро отправляет ответы. Чтобы усложнить задачу, я возвращаю выполнение в виде SVG-тега, но каждое число каждый раз превращается в один и тот же результат, поэтому его не так сложно взломать.
Как функция Node.js может вернуть текст упражнения (например, «9x8») в формате, удобном для чтения человеком, но не так легко читаемом машиной?
в таком простом примере, как «девять, умноженное на восемь», машине немного сложнее прочитать. Вероятно, вывод текста вопроса в изображении (например, в виде капчи) — ваш лучший выбор.
Поскольку «машиночитаемый» является надмножеством «человекочитаемого», когда речь идет о простых строках, я бы предложил какой-то механизм шифрования. Сказав это, я не могу найти хороший, неизвестный пользователю ключ. Любой вид шифрования, основанный на расшифровке на стороне клиента, можно легко обойти, обладая общими знаниями веб-разработки.
Используйте случайное число пробельные символы юникода нулевой ширины (U+200B) вокруг видимых символов. Взломать не сложно, но, по крайней мере, для этого требуется немного дополнительной работы.
Вы говорите, что это обучающее приложение, но в то же время запрограммированные решатели — это проблема? В чем здесь проблема?
Проблема в людях, не входящих в целевую группу, которые хотят саботировать.
Кроме того, почему бы не использовать ограничение скорости? Вы можете определить максимальную скорость, которой может достичь человек, и если она будет превышена, вы поймете, что это машина.
Этот вопрос, каким бы интересным он ни был, слишком широк, чтобы на него можно было дать эффективный ответ. Как ни подходи к этому, никогда нельзя быть уверенным. Что, если я использую бота, чтобы решить эту проблему, но я (человек) жду, чтобы отправить ответ и обмануть вас? Кроме того, это простой тест на умножение. Если кто-то обманывает в этом, это на них. Учитывая класс, на который это нацелено, я не думаю, что они могут легко обмануть, если только вы не нацелитесь на глобальный (по поводу вашей глобальной статистики местоположения). Я думаю, вы переусердствуете, если только это не тренировочная площадка для чего-то более серьезного.
Если вы сохраняете статистику, вы можете позже построить диаграмму и использовать статистический анализ, чтобы увидеть распределение результатов и удалить крайности.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В итоге я преобразовал число в путь SVG. Позже я могу добавить некоторую случайность к числам в пути, чтобы его нельзя было легко обратить. Конечно, это можно было бы обратить вспять с помощью алгоритма OCR, но, по крайней мере, это требует немного больше работы.
В качестве быстрой идеи мне приходит в голову, что вы можете вернуть изображение. Взгляните на этот модуль: npmjs.com/package/text2png. Он конвертирует текст в PNG. После создания PNG вам нужно будет сохранить это изображение в общедоступной папке, а затем отправить путь клиенту, чтобы загрузить его в
<img>.