Как я могу создать текст, который удобочитаем для человека, но не для машинного чтения в Node.js?

Я делаю простое приложение для тренировки умственной математики в https://mattea.app/. Это соревнование на время, и я измеряю время, которое вы тратите на выполнение 10 упражнений.

Упражнения выполняются на сервере — в функции Node.js, обслуживаемой через облачные функции Google Firebase.

Одна из проблем заключается в том, что пользователи могут обманывать, создавая скрипт, который читает упражнения, а затем программно вычисляет и очень быстро отправляет ответы. Чтобы усложнить задачу, я возвращаю выполнение в виде SVG-тега, но каждое число каждый раз превращается в один и тот же результат, поэтому его не так сложно взломать.

Как функция Node.js может вернуть текст упражнения (например, «9x8») в формате, удобном для чтения человеком, но не так легко читаемом машиной?

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

adelriosantiago 05.03.2019 20:18

в таком простом примере, как «девять, умноженное на восемь», машине немного сложнее прочитать. Вероятно, вывод текста вопроса в изображении (например, в виде капчи) — ваш лучший выбор.

ADyson 05.03.2019 20:18

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

bergerg 05.03.2019 20:23

Используйте случайное число пробельные символы юникода нулевой ширины (U+200B) вокруг видимых символов. Взломать не сложно, но, по крайней мере, для этого требуется немного дополнительной работы.

devuxer 05.03.2019 20:31

Вы говорите, что это обучающее приложение, но в то же время запрограммированные решатели — это проблема? В чем здесь проблема?

Etheryte 05.03.2019 20:47

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

Terje Kolderup 05.03.2019 20:55

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

devuxer 05.03.2019 21:00

Этот вопрос, каким бы интересным он ни был, слишком широк, чтобы на него можно было дать эффективный ответ. Как ни подходи к этому, никогда нельзя быть уверенным. Что, если я использую бота, чтобы решить эту проблему, но я (человек) жду, чтобы отправить ответ и обмануть вас? Кроме того, это простой тест на умножение. Если кто-то обманывает в этом, это на них. Учитывая класс, на который это нацелено, я не думаю, что они могут легко обмануть, если только вы не нацелитесь на глобальный (по поводу вашей глобальной статистики местоположения). Я думаю, вы переусердствуете, если только это не тренировочная площадка для чего-то более серьезного.

dev101 05.03.2019 22:36

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

dev101 05.03.2019 22:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
9
104
1

Ответы 1

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

Другие вопросы по теме