R в CRUD - где грань между особенностью и уязвимостью раскрытия? - PullRequest
3 голосов
/ 01 октября 2009

Мы все знаем, как это легко делать наши Ajax-вызовы, используя маршрутизацию адресов и HTTP-Get с параметрами в URL-адресе, потому что клиентская сторона может кэшировать эти вызовы, и, следовательно, нагрузка на сервер снижается, но где вы, ребята, думаете, что строка находится между «аккуратным способом обращения к ресурсам» и «уязвимостью раскрытия»? Я приведу несколько примеров -

Допустим, я на сайте моего банка. На заднем плане мой браузер - HTTP-Getting to / onlinebanking / AForster / Transactions. Конечно, я очень параноидален из-за того, что люди знают мой идентификатор входа в мой банковский счет, поэтому я всегда убеждаюсь, что «запомнить меня» не отмечено. Однако означает ли тот факт, что мой браузер получил доступ к URL-адресу с моим идентификатором входа, является уязвимостью раскрытия?

Что если я на форуме и читаю ограниченную ветку, о которой обычные пользователи не должны знать? Мой браузер извлекает содержимое потока, отправляя сообщения HTTP-Get to / forum / Secret-Board / Im-Going-To-Kill-My-Brother /. Факт того, что я даже получил доступ к этому URL-адресу с помощью Ajax, как-то говорит о существовании этого потока моему брату?

и т. Д. И т. Д. Вы, вероятно, можете придумать больше сценариев. Я действительно хочу получить выгоду от кэширования моих Ajax-вызовов на стороне клиента, но будет ли Ajaxing для этих URL-адресов считаться уязвимостью раскрытия?

Ответы [ 5 ]

0 голосов
/ 01 октября 2009

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

Хотя мои примеры были составлены, я действительно оказался в этом сценарии сегодня. Мой проект выходит из дизайна, и первое, что будет построено, это веб-сервис HTTP / JSON. Вчера я рассмотрел все концепции пользовательского интерфейса и составил список всех точек, где веб-сервис должен предоставлять некоторые данные. Затем, в то время как я пытался втиснуть все эти действия в единую схему URL-адресов, я обнаружил, что хочу добавить некоторую информацию в запросы GET, которая кажется немного чувствительной. Я признаю, что мой оригинальный пост был не столько вопросом, сколько комментарием о потенциальных проблемах безопасности, возникающих в веб-сервисах RESTful (в частности, в конечных точках CRUD), используемых в этом контексте. Я просто никогда не слышал, чтобы кто-то говорил на эту тему с этой точки зрения, и мне было интересно, что вы все подумали.

Я думаю, что наиболее полезный ответ на мой вопрос пришел от Джона Милликина, который указал, что Ajax на основе iframe действительно будет бросать URL-адреса запросов в историю, что я с удивлением узнал. Я почти уверен, что любые XHR-запросы будут жить только в кеше браузера, где ответ также доступен, и в этот момент у вас гораздо большая проблема. Упоминание о XSS-атаках было еще одним интересным моментом; было довольно много случаев, когда люди находили способ раскрыть историю браузера или получить кеш определенного URL. Если кто-то знал, что мой банковский счет был «AForster», а затем нашел способ получить мою кэшированную версию / onlinebanking / AForster / транзакций из контекста другого домена, он мог бы получить довольно много информации.

Как ни странно, я, вероятно, собираюсь в конечном итоге бросить предостережение и передать свои конфиденциальные данные через GET, потому что эти конкретные конфиденциальные данные на самом деле вообще не являются конфиденциальными, и это корпоративная интрасеть, и мы получили TLS внизу. Можно многое сказать о самодокументированных, удобочитаемых, легко запоминающихся URL-адресах. Однако я знаю, что эти запросы будут регистрироваться: 1) нашим веб-сервером, 2) веб-сервером и 3) нашей инфраструктурой VPN. И каждый домашний маршрутизатор, которым я когда-либо владел, имеет родительский контроль, который может регистрировать URL-адреса, и не дай бог, вы запускаете какую-то причудливую CMS / где / everything-damn-thing-is / address-by-title /, а затем кто-то находит способ получить Журналы запросов вашего веб-сервера. Это приемлемый компромисс для меня в моей конкретной ситуации, но в другой ситуации, я думаю, у меня может быть достаточно причин для беспокойства.

0 голосов
/ 01 октября 2009

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

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

  1. Кто-то может подойти к вашему компьютеру, когда вас нет, или, возможно, получить доступ к вашему компьютеру удаленно, или - если надлежащие меры предосторожности не приняты на нескольких уровнях - использовать метод XSS для получения ваших кэшированных URL-адресов через javascript .

И проблема законна, но вы уже указали, какие шаги вы можете предпринять, чтобы облегчить их:

  • Не открывайте несколько окон, некоторые частные, некоторые не такие приватные. Используйте частные сеансы браузера для личного просмотра. У меня действительно была идея для надстройки Firefox, которая позволила бы вам создать своего рода «темный список», список доменов, которые всегда должны быть в режиме инкогнито. Таким образом, вы можете быть на своем банковском сайте, переключиться на твиттер, и он знает, что у него могут быть разные сессии и т. Д.

  • Настройте браузер на удаление (или хотя бы запрос на удаление) всех личных данных при каждом закрытии.

  • На стороне сервера ни один ответственный разработчик веб-приложений не должен КОГДА-ЛИБО использовать учетные данные или личные данные в URL для защищенного сайта. Это не гладко, это лениво. Я думаю, что идентификационные номера или идентификаторы сессии не намного лучше (я вернусь к этому во втором пункте). Ваш банк должен использовать: /onlinebanking/UserServices/transactions в качестве URL-адреса RESTful и должен подтверждать все по каждому запросу, вплоть до IP, на уровне сервера (mod_auth и чертовски хороший сертификат). Я очень устал, когда люди говорят о «снижении нагрузки на сервер» или даже о «снижении количества обращений к базе данных». Программное обеспечение специально разработано для получения большого количества запросов. Мой ноутбук HP, построенный 6 лет назад и похожий на старый холодильник, НЕ был разработан для того, чтобы облегчить нагрузку на сервер, и ожидание 10 минут плохо спроектированного js-скрипта (см .: новый почтовый клиент Yahoo!) вызывает у меня желание нанести удар. И если больше нечего ожидать от плохого испорченного гигантского сервера, он должен обеспечивать вашу безопасность КАЖДЫЙ раз.

Хорошо, эта напыщенная речь окончена.

  • Может ли ваш брат видеть ваши кэшированные URL-адреса? Может быть. Моя подруга может сказать, когда я заходил на сайты ххх, даже когда я очищаю историю (почему? Потому что она все еще отображается в недавно закрытых вкладках! Да, конфиденциальность!) И они не кэшируются для RESTfulness, они кэшируются Потому что это то, что делают браузеры. Таким образом, вы должны принять те же меры предосторожности после перехода на сайт с iamgoingtokillhimtonight/posts в URL-адресе, что и для того, чтобы скрыть свое «я», когда вы заходите на сайты прона или просматриваете день рождения. настоящие идеи.

В части моей интерпретации:

Так что да, URL-адреса кэшируются, и это страшно для любого, кто хочет просмотреть указанный кеш, чтобы попасть в ваш бизнес. Но, похоже, другая проблема, которую вы выражаете, это то, что они могут с этим сделать, то есть кросс-браузерные эксплойты. Может ли кто-то использовать этот кэшированный URL-адрес, чтобы создать сценарий, чтобы получить информацию о вашем банке и уничтожить вас? Да. Но преимущество, которое они получают, если они уже знают, как это сделать, невелико. Это больше похоже на то, чтобы сохранить им шаг, а не оставлять ключи в дверях. Если я смогу каким-то образом увидеть ваш кеш через js и, таким образом, увидеть URL-адрес вашего безопасного банка, то я мог бы так же легко увидеть URL-адрес вашего банка, если они не использовали симпатичный URL, и так же легко написать мой XSS вокруг него. И если я смогу увидеть ваш кеш, я наверняка смогу увидеть ваши куки и украсть их (только в Интернете файлы cookie стоят больше, чем кеш). Поэтому применяются те же правила до AJAX:

  • Пользователи не должны записывать пароли
  • Срок действия файлов cookie сеанса должен истечь в конце сеансов
  • веб-приложения должны использовать белые списки, сертификаты и одноразовые номера для обеспечения целостности и подлинности запросов пользователя.

Я не могу не подчеркнуть, насколько успех XSS основан на лени (или невежестве) разработчиков (включая меня) и растерянности и наивности пользователей. Большинство действительно больших результатов XSS включают в себя социальные хакинг до интернет-хакерства. Фишинг-мошенничество или письмо от старого друга или испанского заключенного, просто просит вас перейти по этой невинной ссылке или поделиться какой-то бессмысленной личной информацией. Одна вещь, которую я мог видеть на примере вашего банка, которая усугубила бы ситуацию, заключается в том, что теперь я знаю по этому сайту, что ваше имя - Алекс, а по URL-адресу - ваша фамилия - Форестер. Это может упростить поиск подробностей, чтобы облегчить получение другой информации.

Итак, в общем и целом, наконец:

RESTfulness и AJAX не представляют намного большей угрозы, чем история браузера и плохая безопасность сервера, и поэтому одни и те же правила применяются как к пользователям, так и к разработчикам. Но вы совершенно правы, что такие RESTful URL указывают на то, что мы ухудшаем эти методы, а не улучшаем; использовать технологию, чтобы быть ленивее, вместо того, чтобы использовать преимущество, чтобы сосредоточиться на реальной тяжелой работе.

Ну, это было весело. Вернуться к соляным шахтам.

0 голосов
/ 01 октября 2009

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

Итак, не думайте, что все, что там кешируется, будет защищено - и не допускайте «конфиденциальная» информация для кэширования там. «Что чувствительно», спросите вы? Ну, все, что вы не хотели бы быть раскрыты любому другому пользователю. Банковский счет, секретные форумы, имя пользователя, идентификатор сеанса, детали транзакции - ни одно из этого не должно быть разрешено кэшировать или хранить на клиенте.

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

0 голосов
/ 01 октября 2009

Поскольку URL-адреса являются непрозрачными идентификаторами для веб-браузера, единственная цель добавления к ним удобочитаемого текста - облегчить запоминание.

Банк должен использовать анонимный идентификатор вместо вашего имени. Пока соединение (надеюсь!) Зашифровано, URL все равно будет храниться в истории вашего браузера, где третьи лица смогут получить к нему доступ. Анонимный идентификатор или даже временный идентификатор сеанса будет более безопасным.

Пример форума содержит странную фразу: «Запрещенная тема, о которой обычные пользователи не должны знать». Действительно ли имеет значение, знают ли обычные пользователи поток или нет? Проблема заключается в том, что тема потока раскрывается в URL, что является уязвимостью. URL-адрес должен быть примерно таким: /forum/thread/12345/.

Честно говоря, это не имеет ничего общего с CRUD, AJAX или любыми другими модными словами, которые вы добавили в свой вопрос. Вопрос в том, приемлемо ли раскрытие секретной информации в виде открытого текста, и ответ «нет».

0 голосов
/ 01 октября 2009

Самый простой способ избежать такого раскрытия - это использовать идентификационные номера вместо строк.

Нет ничего показательного в /forum/Board-214/Thread-5625/posts или что-то в этом роде.


Обратите внимание, что я не обязательно согласен с этой проблемой, просто предоставляю обходной путь.

В каких ситуациях злоумышленник может получить URL-адреса запроса AJAX, но не тело ответа?

...