2017-01-13 3 views
0

Итак, чтобы сохранить безопасность, мы решили сменить главный ключ нашего Parse Server.Parse PHP SDK полностью игнорирует изменение MasterKey

Наш iOS продолжал работать, потому что ему требовался только идентификатор приложения, но на удивление наши скрипты PHP также работали, хотя они были инициализированы WRONG MasterKey.

  1. Разделяет ли Parse PHP SDK полное изменение основного ключа?
  2. Как мы можем предотвратить старые сценарии php, у которых есть ключ приложения для доступа к нашим данным и «чтению» данных?

Согласно документации:

ParseClient::initialize('YOUR_APP_ID', '', 'YOUR_MASTER_KEY'); 
ParseClient::setServerURL('http://YOUR_PARSE_SERVER:1337/parse'); 
+0

Нет PHP SDK не игнорирует главный ключ. Просто проверьте, что оба sdk и parse-server работают с одним и тем же ключом. – Cliffordwh

+0

Благодарим вас за ответ. Это проблема. мы изменили мастер-сервер parse-server, но оставили старый мастер-ключ в init. Сценарий каким-то образом справляется с работой. Мы пробовали разные вещи, чтобы предотвратить работу php. например, мы включили RestKey на сервере, и теперь php будет работать, только если RestKey был предоставлен во втором аргументе. Это решило бы это, но iOS теперь не работало. Необходимо найти способ де-авторизации php без отмены авторизации iOS. – bendigi

+0

перезапустили ли синтаксический анализатор после его изменения? – Cliffordwh

ответ

0

Мое предложение к вам будет следующим.

Использовать RestKey для PHP как ваш второй аргумент, а затем IOS вы можете просто использовать clientKey в качестве второго аргумента.

Просто убедитесь, что вы добавили на свою сторону сервера как restKey, так и clientKey.

мой рабочий swift3 пример тоже!

let configuration = ParseClientConfiguration { 
      $0.applicationId = PARSE_APP_KEY 
      $0.clientKey = PARSE_CLIENT_KEY 
      $0.server = PARSE_URL 
      $0.isLocalDatastoreEnabled = true 

     } 
     Parse.initialize(with: configuration) 

EDIT/QUOTE:

Если вы посмотрите в ParseClient::initialize мастер-ключ хранится в статическом вар $masterKey. Это используется в ParseClient::_getRequestHeaders (когда главный ключ использование требуется), чтобы обеспечить X-Parse-Master-Key с основным ключом в качестве значения.

Главный ключ определенно используется, но это зависит от запроса. Если $useMasterKey является ложным для данного запроса в ParseClient::_request (значение по умолчанию также ложно), главный ключ не будет добавлен в заголовки запроса. В таком случае главный ключ не будет использоваться, но это ожидаемое поведение.

+0

Спасибо за решение и потратить на него время. Проблема заключается в том, что iOS уже поставляется и находится в производстве. – bendigi

+0

Что вы передаете в инициализации для IOS? @bendigi – Cliffordwh

+0

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

0

1.) Да, parse php sdk не делает никакой проверки на главном ключе. Проверка выполняется на стороне сервера анализа, который вы используете. По сути, главный ключ существует, чтобы разрешить переопределение ACL, как указано в sdk docs. Он отправляется на сервер при отправке запроса, который запрашивает использование главного ключа.

В принципе, если вы делаете какие-либо запросы, которые необходимо переопределить ACL, и вы укажете использовать мастер-ключ, тогда будет отправлен главный ключ. В других случаях главный ключ не отправляется. Вы можете проверить это, написав быстрый код, который отправит мастер-ключ, например $object->save(true). В этом случае ваш главный ключ должен сбой, если он не соответствует загруженному на сервере.

2.) Вы действительно не можете помешать кому-то выяснить свой Идентификатор приложения. Безопасность, которую вы ищете, не так много на стороне клиента, как на сервере. Вы должны быть уверены, что настроили ACL объектов и классов, чтобы ограничить доступ ко всем объектам (и классам), которые вы не хотите читать (или записывать) произвольными лицами. Роли - довольно хороший способ применить это к широкому набору объектов, например ограничить доступ к роли администратора.Если вы заблокируете свои данные, это потребует, чтобы кто-то нарушил существующую учетную запись с доступом к этим данным, вместо того, чтобы просто использовать ваш идентификатор приложения.

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

Надеюсь, это поможет прояснить роль главного ключа для вас, ребята.

+0

Спасибо за ответ. Я понимаю концепцию ACL, но как бы вы это разработали. Класс A содержит продукты, которые могут быть прочитаны всеми пользователями приложений (независимо от того, вошли ли они в систему или нет). Тем не менее, отдельные строки продуктов принадлежат пользователю и должны быть изменены только тогда, когда этот пользователь вошел в систему. Все продукты могут быть прочитаны и изменены с помощью PHP SDK (где вы предлагаете использовать MasterKey). Как бы вы запретили третьему лицу читать класс A без надлежащей проверки подлинности? Я что-то пропустил? – bendigi

+0

Нет проблем! Для обеспечения того, что строки могут быть изменены только пользователем (но могут быть прочитаны всеми), вы можете просто установить ACL, чтобы публика могла читать, но могут писать только пользовательские пользователи. Что касается чтения третьей стороны, вы можете только предотвратить это, если вы удалите общедоступное чтение из ACL. Вы можете заменить эту роль, например, «Пользователи», и убедитесь, что все в ней, но это будет означать, что пользователи, которые не вошли в систему, не смогут читать сейчас. Вы находитесь в небольшом месте, вам нужно выбрать и выбрать то, что открыто, и что не основано на вашем сценарии. – montymxb

+0

Спасибо .. Pinch хорош, пока он не превращается в ожог. Я очень ценю то время, которое вы потратили на это. – bendigi

Смежные вопросы