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 ?
meteor-security
By Florian Genaudet
meteor-security
- 884