Loading

meteor-security

Florian Genaudet

This is a live streamed presentation. You will automatically follow the presenter and see the slide they're currently on.

MeteorJS

La sécurité

@fgenaudet

  • Humantalks
  • We Are One Sàrl
  • Développeur passioné 

Thibault Fouach

  • Développeur passioné

Principes de sécurité 

  • Ne jamais faire confiance aux clients
  • Ne pas exposer de données sensibles
  • Contrôler les opérations de persistance 

Rappel

Mongo <-> MiniMongo

 

Mongo côté serveur

Mini Mongo côté client qui permet de faire le CRUD

Mini-Databases

https://www.meteor.com/mini-databases

Packages par défaut

MACFGT:demo fgenaudet$ meteor list 
autopublish           1.0.4  (For prototyping only) Publish the entire database to all clients
blaze-html-templates  1.0.1  Compile HTML templates into reactive UI with Meteor Blaze
ecmascript            0.1.5  Compiler plugin that supports ES2015+ in all .js files
es5-shim              4.1.13  Shims and polyfills to improve ECMAScript 5 support
insecure              1.0.4  (For prototyping only) Allow all database writes from the client
jquery                1.11.4  Manipulate the DOM using CSS selectors
meteor-base           1.0.1  Packages that every Meteor app needs
mobile-experience     1.0.1  Packages for a great mobile user experience
mongo                 1.1.2  Adaptor for using MongoDB and Minimongo over DDP
session               1.1.1  Session variable
standard-minifiers    1.0.1  Standard minifiers used with Meteor apps by default.
tracker               1.0.9  Dependency tracker to allow reactive callbacks

Insecure

Permet d'écrire dans Mongo depuis le client.

Auto-publish

Toutes les collections sont publiées vers le client, avec toute les données des objets.

Packages par défaut

Suppression des packages

meteor remove insecure
meteor remove autopublish

Avec Meteor

  • Limiter les opérations possibles sur les collections
  • Utiliser les méthodes Meteor
  • Limiter les données visibles des objets
  • Limiter les données que l'on peut mettre à jour

Limiter les opérations

Games.allow({
	insert: function(userId, game) {
		 /* only allow posting if you are logged in */
		 return !! userId;
	},
	remove: function(userId, game) {
		return !! userId && game.createdBy === userId;
	},
	update: function(userId, game) {
		return !! userId && game.createdBy === userId;
	}
});
  • Limite les opérations côté client en executant les méthodes côté serveur
  • Cas d'une écriture en base directement depuis le client

Méthodes Meteor

Meteor.methods({
  addTask: function (text) {
    // Make sure the user is logged in before inserting a task
    if (! Meteor.userId()) {
      throw new Meteor.Error("not-authorized");
    }
 
    Tasks.insert({
      text: text,
      createdAt: new Date(),
      owner: Meteor.userId(),
      username: Meteor.user().username
    });
  },
  deleteTask: function (taskId) {
    Tasks.remove(taskId);
  },
  setChecked: function (taskId, setChecked) {
    Tasks.update(taskId, { $set: { checked: setChecked} });
  }
});
  • Fichiers dans /serveur, non visible au client

Limiter les champs visibles

// server: publish the rooms collection, minus secret info.
Meteor.publish("rooms", function () {
  return Rooms.find({}, {fields: {secretInfo: 0}});
});

// publish only the secret info field
Meteor.publish("adminSecretInfo", function () {
  return Rooms.find({admin: this.userId}, {fields: {secretInfo: 1}});
});
  • Côté serveur
  • Limite les champs visibles selon les souscriptions

Limiter les données modifiables

Messages.deny({
  update: function (userId, doc, fields, modifier) {
    if (_.contains(fields, "createdAt") || _.contains(fields, "userId")) {
      return true;
    }
  }
});
  • Deny permet d'interdire une opérations
  • Ici on interdit la mise à jour si les champs userId ou createdAt ont été mis à jour

En savoir plus

  • https://www.discovermeteor.com/blog/allow-deny-a-security-primer/
  • https://www.meteor.com/tutorials/blaze/publish-and-subscribe
  • http://docs.meteor.com/#/full/meteor_methods

Demo

Unsecure vs secure

Merci

Des questions ?

Made with Slides.com