Как защитить ключ Rest API для Parse в html-приложении

Я изучал Angular.js и использовал Parse в качестве внутреннего сервиса. Чтобы отправить данные в Parse RESTful API, вы должны передать ключ REST API и идентификатор приложения в заголовке запроса следующим образом:

var config = {headers: {"X-Parse-REST-API-Key":"someapikey", "X-Parse-Application-Id":"someappid"}};

$http.post("https://api.parse.com/1/classes/myobject", obj, config).success (
            function(data) {console.log(data);}
);

Хотя это отлично подходит для обучения, мне интересно, как RESTful API для Parse или любого другого поставщика Backend-as-Service будет работать в реальном html-приложении. Ключ API и идентификатор приложения будут отображаться в JavaScript, и любой, кто достаточно умен, чтобы просмотреть исходный код, сможет изменить данные в вашей учетной записи.

Единственный способ, которым я могу представить, что это работает, - это прокси-сервер, который добавляется к заголовку Api Key/App Id. Однако это лишило бы смысла не запускать собственный внутренний сервер. Я что-то упустил здесь?


person ltfishie    schedule 06.08.2013    source источник
comment
Что, если вы получите его с помощью AJAX? В конце концов, все, что представлено на веб-сайте, доступно   -  person Ian    schedule 06.08.2013
comment
Аналогичный вопрос с форумов Parse; parse.com/questions/   -  person Jonathan    schedule 06.08.2013


Ответы (2)


Вот чего вам не хватает :)

Ключи Parse.com REST/JavaScript предназначены для использования «в дикой природе». С этими ключами невозможно обойти правила доступа к объектам или проверки перед сохранением. Это может сделать только мастер-ключ. Защитите главный ключ. Полезной аналогией является шифрование с открытым ключом: вам нужно поделиться своим открытым ключом, но защитить закрытый ключ.

Кто-нибудь может изменить ваши данные? Да, но только если вы им позволите. Могут ли пользователи запрашивать данные, принадлежащие другим пользователям? Да, но опять же, только если вы им позволите. У Parse есть несколько способов обеспечить целостность и безопасность данных.

Во-первых, это разрешения для каждого объекта. Используйте веб-интерфейс Parse.com, чтобы задать а) возможность создания классов на лету и б) разрешения CRUD для существующих классов. Один из самых простых шагов для защиты приложения — отключить любые разрешения класса, которые не требуются явно. Например, объекты, созданные на сервере, которые не должны быть доступны для записи (или, возможно, чтения) конечными пользователями.

Второй — списки управления доступом (ACL). ACL устанавливаются для каждой записи. Они определяют, какие пользователи или роли могут читать или записывать запись. Записи без ACL являются общедоступными (любой пользователь может найти их). Если Сью создает запись, которая должна быть для нее личной, установите ACL как таковой. Том не сможет найти его без отмычки.

Третий — облачный код. Вы можете применять критически важные бизнес-правила и проверки данных, используя функции beforeSave/afterSave. Определите, что действительно важно, и убедитесь, что это проверено в этих функциях. Также рекомендуется явно установить ACL в этих функциях. ACL могут быть переданы при создании объекта, но конечный пользователь может изменить их.

Вот краткое практическое правило безопасности и целостности.

  • Разрешения на доступ к объектам должны быть настолько открытыми, насколько это необходимо для поддержки ваших требований.

  • Каждая запись должна иметь ACL, если вы не уверены, что это не так.

  • Большинство ACL должны быть установлены с функциями before/afterSave.

  • Любые проверки, которые должны выполняться, должны проверяться в функциях before/afterSave.

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

person Drew Goodwin    schedule 06.08.2013

Parse предоставляет несколько ключей доступа, которые можно использовать через разные API:

  • Клиентский ключ (для использования из приложений iOS и Android)
  • Ключ Javascript
  • Ключ Windows
  • ОТДЫХ
  • Главный ключ (используется для доступа к REST API, но не соответствует разрешениям ACL для объектов)

При доступе к Parse из клиентского javascript вы должны использовать javascript API с ключом доступа Javascript.

С точки зрения безопасности вы не сможете запретить пользователям использовать ключ доступа, который используется javascript на стороне клиента. Parse обеспечивает мощный контроль доступа с помощью списков ACL, прикрепленных к каждому объекту, что позволяет ограничить доступ на чтение/запись к каждому классу для определенных пользователей. Вы также можете запретить клиентам создавать новые классы в настройках вашего приложения. Ознакомьтесь с руководством по безопасности здесь.

person alxmitch    schedule 06.08.2013