Вопрос

В настоящее время мы работаем над очень простом WebApp, и мы хотели бы "запутанный" (Что было бы правильным сроком?) Или кодировать как-то параметр запроса, поэтому мы можем снизить вероятный пользовательский пользователь от отправки произвольно данных.

Например, URL выглядит как /webapp?user=Oscar&count=3

Мы хотели бы иметь что-то вроде: /webapp?data=EDZhjgzzkjhGZKJHGZIUYZT И иметь эту ценность декодировать на сервере с реальной информацией о запросе.

Прежде чем войти в реализацию чего-то вроде этого себя (и, вероятно, это неправильно), я хотел бы знать, есть ли что-то сделать это уже?

У нас есть Java на сервере и JavaScript на клиенте.

Это было полезно?

Решение

Нет, не делай этого. Если вы можете построить что-то в своем клиентском коде, чтобы запустить данные, передаваемые обратно на сервер, то так может быть преднамеренным хакером. Вы просто не можете доверять отправленным данным на ваш сервер, независимо от того, что делает ваш официальный клиент. Придерживайте, чтобы избежать данных клиента и проверки его против белока на стороне сервера. Отказ Используйте SSL, и если вы сможете, поместите параметры запроса в пост вместо того, чтобы получить.

Расширение редактирования

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

Использование SSL не мешает клиенту подделать данные, но оно предотвращает их видеть или вмешиваться в него. Он также инструктирует хорошо поведенскими браузерами не кэшировать конфиденциальные данные в истории URL.

Похоже, у вас есть какое-то простое веб-приложение, которое не имеет аутентификации, и передает параметры запроса, которые контролируют его вправо в GET, и, таким образом, некоторые нетехнологичные люди могут выяснить, что user=WorkerBee может просто быть изменено на user=Boss В их панели браузера, и, таким образом, они могут получить доступ к данным, которые они не должны видеть, или делать то, что они не должны делать. Ваше желание (или желание вашего клиента), чтобы запутать эти параметры наивно, так как он только собирается фольги наименее технический человек. Это наполовину запеченная мера и причина, по которой вы не нашли существующее решение, заключается в том, что это не хороший подход. Отказ Вы лучше проводить время, осуществляющие приличную систему аутентификации с помощью ревизионного следа для хорошей меры (и если это действительно то, что вы делаете, отметьте Ответ Гэри как правильно).

Итак, чтобы обернуть его:

  1. Безопасность по запуску не является безопасностью вообще.
  2. Вы не можете доверять данным пользователям, даже если оно скрыто.Проверьте ваши данные.
  3. Использование безопасных каналов связи (SSL) помогает блокировать другие связанные угрозы.
  4. Вы должны отказаться от вашего подхода и делать правильные вещи. Правильно, в вашем случае, вероятно, означает добавление механизма аутентификации с помощью системы привилегии для предотвращения доступа пользователей доступа к вещам, которые они не достаточно привилегированы, чтобы увидеть, включая вещи, которые они могут попытаться получить доступу от соответствующих параметров Get. Ответ Гэри Р, как и Дейв и прокомментируют комментарий ударили это на голову.

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

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

SALT = "so9dnfi3i21nwpsodjf";

function computeUrl(url) {
  return url + "&hash=" + md5(url + SALT );
}

function checkUrl(url) {
  hash = /&hash=(.+)/.match(url);
  oldUrl = url.strip(/&hash=.+/);
  return md5(oldUrl + SALT ) == hash;
}

Если вы пытаетесь ограничить доступ к данным, то используйте какой-то механизм входа в систему с помощью файла cookie, предоставляя один знак на ключ аутентификации. Если клиент отправляет куки с ключом, то они могут манипулировать данными в соответствии со властями, связанными со своим аккаунтом (Admin, Public user etc). Просто посмотрите на Spring Security, CAS ETC для простого в использовании реализации этого в Java. Токены, представленные в файле cookie, обычно шифруются с закрытым ключом сервера выпуска и, как правило, являются доказательством доказательства.

В качестве альтернативы, если вы хотите, чтобы ваш государственный пользователь (не поддерживаемый) иметь возможность размещать некоторые данные на свой сайт, то все ставки выключены. Вы должны подтвердить на стороне сервера. Это означает ограничение доступа к определенным УРИ и убедиться, что весь вход очищен.

Золотое правило здесь запрещает все, кроме того, что вы знаете, это безопасно.

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

Тогда вы можете просто:

http://example.com/service?x=123&y=Bob&sig=ABCD1324

Эта техника выставляет данные (то есть они могут «видеть», что XYZ = 123), но они не могут изменить данные.

Есть преимущество «шифрования» (и я использую этот термин свободно). Здесь вы шифруете весь раздел параметра URL.

Здесь вы можете сделать что-то вроде:

http://example.com/service?data=ABC1235ABC

Приятно использовать шифрование - это два раза.

Одним из них защищает данные (они никогда не смогут видеть, что XYZ = 123, например).

Другой особенностью, что это расширяется:

http://example.com/service?data=ABC1235ABC&newparm=123&otherparm=abc

Здесь вы можете декодировать оригинальную полезную нагрузку и сделать (безопасно) слияние с новыми данными.

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

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

Очевидно, вы не хотите делать ни одно из этого на клиенте. Нет никакого смысла. Если вы можете сделать это, «они» могут сделать это, и вы не можете сказать разницу, чтобы вы могли бы также не делать это вообще - если вы не хотите «шифровать» данные по нормальному порту HTTP (VS TLS, Но тогда люди удивительно удивляются: «Зачем беспокоиться»).

Для Java вся эта работа уходит в фильтре, так я это сделал. Задний конец изолирован от этого.

Если вы хотите, вы можете сделать задний конец полностью изолированным из этого с исходящим фильтром, который обрабатывает шифрование / подпись URL-адреса.

Это тоже то, что я сделал.

Внизу - это то, что она очень вовлечена, чтобы получить его правильно и исполнить. Вам нужен легкий силовой анализатор HTML, чтобы вытащить URL-адреса (я написал потоковый парсер, чтобы сделать это на лету, чтобы он не скопировал всю страницу в RAM).

Яркая сторона - это все сторона содержимого «просто работает», так как они ничего не знают об этом.

Также есть некоторая специальная обработка при работе с JavaScript (поскольку ваш фильтр не будет легко «знать», где есть URL для шифрования). Я решил это, требуя подписания URL-адресов, чтобы быть конкретными «VAR SignedURL = '....», поэтому я могу найти их легко на выходе. Не так сокрушил нагрузку на дизайнеров, как вы думаете.

Другая яркая сторона фильтра состоит в том, что вы можете отключить его. Если у вас есть какое-то «странное поведение», просто выключите его. Если поведение продолжается, вы нашли ошибку, связанную с шифрованием. Он также позволяет разработчикам работать в простом тексте и оставить шифрование для тестирования интеграции.

Боль, чтобы сделать, но это приятно в целом в конце.

Что-то вроде jcryptic?

http://www.jcryption.org/examples/

Вы можете кодировать данные, используя Base64 или что-то подобное. Я бы закончил аргументы в здравом выражении JSON, чтобы сериализовать их.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top