Могу ли я безопасно читать данные Captcha из JavaScript?

Мы используем элемент управления Captcha в регистрационной форме, в которой мы проводим полную проверку клиента для всех полей в JavaScript (JQuery) помимо проверки сервера.
Я пробовал много способов, но все они будут писать значение Captcha в JavaScript, к которому можно получить доступ кем угодно :(
Я ищу, есть ли способ, позволяющий мне проверять значение Captcha на стороне клиента с помощью JQuery безопасным способом, или это невозможно?


person Amr Badawy    schedule 06.06.2010    source источник


Ответы (3)


Это невозможно.

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

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

Все остальное зависит от обращений к серверу.


В соответствии с запросом на комментарий, вот общая идея:

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

Теперь, сохраняя эту строку отдельно, но также создайте другую строку, которая представляет собой конкатенацию случайной строки и ответа Captcha. Из этой новой объединенной строки вы генерируете ее хэш (например, SHA-1).

using System.Web.Security;
...
string hashVal = FormsAuthentication.HashPasswordForStoringInConfigFile(combined, "SHA1");

Как случайная строка, так и хеш-значение должны быть размещены на странице, чтобы javascript мог ее прочитать.

На стороне клиента, когда пользователь отвечает на Captcha, возьмите случайную строку и объедините ее с ответом (идея здесь?). Взяв эту строку, вы можете использовать что-то вроде плагина SHA-1 JQuery для хеширования и сравнения это с предварительно вычисленным хешем, который вы отправили.

hashVal = $.sha1(combinedString)

Если он совпадает, это (почти) наверняка правильный ответ. Если нет, то это 100% неправильный ответ.

person Dan McGrath    schedule 06.06.2010
comment
Дэн, не могли бы вы привести мне пример «соленого хеш-раствора»? - person Amr Badawy; 06.06.2010
comment
На самом деле вы можете использовать хеширование, чтобы не отображать значение captcha, но при этом включить проверку на стороне клиента. Это, конечно, только для отзывчивого пользовательского интерфейса и также должно проверяться на сервере. - person Dykam; 06.06.2010
comment
Раскрывая хеш-значение, злоумышленник может сделать несколько предположений, не отправляя его на сервер. Кроме того, если он не может получить правильное предположение, он может обновить страницу. Это может позволить злоумышленнику иметь гораздо лучшую частоту ударов при более низкой частоте обнаружения. - person Dan McGrath; 06.06.2010
comment
@Dykam Если выигрыш касается только отзывчивого пользовательского интерфейса на экране капчи, кажется, что раскрытие всего, что могло бы помочь злоумышленнику, - слишком большой вес с другой стороны - person Dr. belisarius; 06.06.2010
comment
Если вы используете какой-то метод хеширования sha, хакерам лучше использовать взломщики captcha, поскольку радужные таблицы не очень подходят для sha, поскольку обе таблицы будут слишком большими. - person Dykam; 06.06.2010

вы можете использовать ajax для отправки текущего значения на сервер, который будет отвечать true или false. это помешало бы вам сделать настоящий пост, а также не дать значение catpcha в html.

person nathan gonzalez    schedule 06.06.2010
comment
К сожалению, мы не будем использовать ajax для скрытой проверки сервера, поэтому мы ищем другое решение в JQuery. - person Amr Badawy; 06.06.2010
comment
Думаю, тогда мне придется согласиться с Дэном. без раскрытия ответа в вашем скрипте или html нет разумного способа сделать это. - person nathan gonzalez; 06.06.2010
comment
Только в JQuery нет решения. Только доступ к серверу даст вам душевное спокойствие. - person Amadan; 06.06.2010

Мое решение)) Каждый раз, когда страница показывает пользователю капчу, вы можете динамически генерировать обфусцированные функции JavaScript (я думаю, что лучше всего 5 или 10). Например, одна функция (или 3))) может устанавливать файлы cookie с предварительно сгенерированным хешем (сервер возвращает его) (из реального значения капчи), другие функции должны реализовывать алгоритм на стороне сервера для проверки значения, введенного пользователем. Я могу сказать, что это работает на 100%, потому что очень сложно динамически анализировать javascript + мы устанавливаем пользовательские файлы cookie на стороне клиента (ботам очень сложно узнать, где и как вы устанавливаете и проверяете файлы cookie), используя JavaScript .

person Saff    schedule 06.06.2010
comment
извините Сафф, но не могли бы вы подробнее объяснить свое решение - person Amr Badawy; 06.06.2010
comment
У вас есть простой хеш на стороне сервера для capcha: md5 (captcha_srv_side) Нам нужно сопоставить этот хеш с хешем на стороне клиента. Самый простой способ - разделить наш хеш на 2 части и записать его в cookie пользователя на стороне сервера ({v1: 81b .., v2: 873f ...}). Теперь у нас есть две переменные в пользовательских файлах cookie. Мы можем написать очень сложный код, используя множество функций javascript, а затем запутать этот код. Когда пользователь вводит капчу, скрипт запускает функцию события js, которая объединяет 2 переменных (v1, v2), генерирует md5 из строки пользователя, записывает ее в куки, а затем сопоставьте их. Это всего лишь небольшой пример. Есть много вариаций. - person Saff; 06.06.2010