Мы используем элемент управления Captcha в регистрационной форме, в которой мы проводим полную проверку клиента для всех полей в JavaScript (JQuery) помимо проверки сервера.
Я пробовал много способов, но все они будут писать значение Captcha в JavaScript, к которому можно получить доступ кем угодно :(
Я ищу, есть ли способ, позволяющий мне проверять значение Captcha на стороне клиента с помощью JQuery безопасным способом, или это невозможно?
Могу ли я безопасно читать данные Captcha из JavaScript?
Ответы (3)
Это невозможно.
Как вы знаете, Javascript находится на стороне клиента, и любой код на стороне клиента должен рассматриваться как потенциально скомпрометированный, поскольку вы не контролируете его.
В лучшем случае вы можете прибегнуть к отправке соленого хеша значения вместе с солью, но даже это само по себе может быть использовано для проверки значений предположений перед фактической отправкой.
Все остальное зависит от обращений к серверу.
В соответствии с запросом на комментарий, вот общая идея:
Во-первых, на сервере вычислите случайную строку, которая будет использоваться в качестве соли. Это должно быть примерно уникальным для каждого запроса. Эта строка предназначена для предотвращения атак с использованием радужных таблиц.
Теперь, сохраняя эту строку отдельно, но также создайте другую строку, которая представляет собой конкатенацию случайной строки и ответа Captcha. Из этой новой объединенной строки вы генерируете ее хэш (например, SHA-1).
using System.Web.Security;
...
string hashVal = FormsAuthentication.HashPasswordForStoringInConfigFile(combined, "SHA1");
Как случайная строка, так и хеш-значение должны быть размещены на странице, чтобы javascript мог ее прочитать.
На стороне клиента, когда пользователь отвечает на Captcha, возьмите случайную строку и объедините ее с ответом (идея здесь?). Взяв эту строку, вы можете использовать что-то вроде плагина SHA-1 JQuery для хеширования и сравнения это с предварительно вычисленным хешем, который вы отправили.
hashVal = $.sha1(combinedString)
Если он совпадает, это (почти) наверняка правильный ответ. Если нет, то это 100% неправильный ответ.
вы можете использовать ajax для отправки текущего значения на сервер, который будет отвечать true или false. это помешало бы вам сделать настоящий пост, а также не дать значение catpcha в html.
Мое решение)) Каждый раз, когда страница показывает пользователю капчу, вы можете динамически генерировать обфусцированные функции JavaScript (я думаю, что лучше всего 5 или 10). Например, одна функция (или 3))) может устанавливать файлы cookie с предварительно сгенерированным хешем (сервер возвращает его) (из реального значения капчи), другие функции должны реализовывать алгоритм на стороне сервера для проверки значения, введенного пользователем. Я могу сказать, что это работает на 100%, потому что очень сложно динамически анализировать javascript + мы устанавливаем пользовательские файлы cookie на стороне клиента (ботам очень сложно узнать, где и как вы устанавливаете и проверяете файлы cookie), используя JavaScript .