Простая проверка пользователя в метеоре, это безопасно?

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

Я делаю простую проверку в моем шаблоне администратора так:

<template name="admin">
{{#if currentUser}}
{{loginButtons}}
  {{#if isUserAdmin}}
     show some stuff here...
  {{/if}}
{{ else }}
{{loginButtons}}
{{/if}}
</template>

Тогда у моих помощников я:

Template.admin.isUserAdmin = function(){
  var adminEmail = Meteor.user().emails[0].address;
  if( adminEmail === "[email protected]"){
    return true;
  } else {
    return false;
    //add some logic for displaying error template.
  }
}

Достаточно ли этого, чтобы обеспечить безопасность приложения или мне нужно что-то еще?

Ответ 1

Это не достаточно. Основное правило: никогда не доверять своему клиенту. Любая часть клиентского кода может быть заменена на что-либо еще - в вашем случае функция isUserAdmin может быть изменена для возврата всегда true.

Чтобы быть в безопасности, вам необходимо установить фильтры безопасности на стороне сервера.

1) Настройте разрешения на запись/удаление для данных, разрешенных только для админов. См. http://docs.meteor.com/#allow

2) Если у вас есть данные, которые не должны быть видимыми для всех пользователей, но только для администраторов (таких как ваши электронные письма пользователя, история цен на продукт, неопубликованные статьи и т.д.), обязательно проверьте привилегии в publish вызов. Например:

Meteor.publish('unpublishedArticles', function() {
    if(!this.userId) return null;
    var user = Meteor.users.findOne(this.userId);
    if(user.admin) return Articles.find({published: false});
    return null;
});

Опять же, важно, чтобы данные были отфильтрованы в publish, поскольку вызовы subscribe можно легко подделать.

3) Кроме того, не разумно, чтобы ваша электронная почта была встроена непосредственно в код клиента. Это лучше (и проще использовать в будущем), чтобы отметить привилегированных пользователей с полем admin = true.

Эти шаги должны быть достаточными для обеспечения безопасности вашего приложения.