Могу ли я читать данные капчи из JavaScript безопасным способом? - PullRequest
7 голосов
/ 06 июня 2010

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

Ответы [ 3 ]

8 голосов
/ 06 июня 2010

Это невозможно сделать.

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

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

Все остальное зависит от звонков на сервер.


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

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

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

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

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

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

hashVal = $.sha1(combinedString)

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

1 голос
/ 06 июня 2010

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

0 голосов
/ 06 июня 2010

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

...