Làm thế nào ngăn member viết những đoạn code nguy hiểm trên system
-
Mình đang làm một Chatbot platform, trong này user có thể dùng UI để tạo Bot (giống chatfuel/manychat). Tuy nhiên bên cạnh đó, platform của mình cho phép member nhúng những đoạn code nodejs vào hệ thông.
Vấn đề platform mình là một cloud platform, cho phép nhiều user đăng ký và tạo Bot của riêng họ, việc cho phép nhúng mã Nodejs vào Bot kiểu này là việc nguy hiễm vì nó có thể tạo điều kiện một member này "quyét" data của một member khác.
Để giải quyết việc này, mình cấm không cho các keywork sau xuất hiện trong code: "require, import, exec, process, new, window, throw". Vì không require/import được plugin, không chạy exec hay process thì không can thiệp vào system đc . . . và member này sẽ không access vào resource member khác đc.
Các bác thấy vậy đủ chưa, hay còn cần thêm các bước khác nữa ? nếu có ý kiến hay xin vui lòng chỉ giáo !
-
cho chạy nodejs vào thì cam sa được khi mã hoá code @@!
-
@Quang-Vu-Quang Bạn đánh giá lại việc có nên cho phép chạy mã ở server ko thì cho phép user gọi API thôi. Nếu vẫn muốn cho user chèn mã dạng
plugins
thì tìm hiểu về Sandbox xem, nếu triển được thì xem như an toàn tuyệt đối.Mình search qua thì có 2 module cho phép làm việc này:
-
Code của member về cơ bản đưa vào sandbox nhưng vẫn phải cho họ access vào một số resource nào đó. Mình đã viết một số API để họ access vào DB bao gồm CRUD nhưng vẫn chưa an tâm.
@Vũ : bác biết plugin sandbox nào phù hợp không, giới thiệu mình với
-
@Quang-Vu-Quang Như trên là mình có giới thiệu tới
vm2
là an toàn cho việc chạy các đoạn mãunstrusted
của user.Việc còn lại là cách thiết kế của bạn, trên trang github của
vm2
có giới thiệu 1 đoạn mã như này mình thấy khá ổn. Bạn xem api sandbox, mock của NodeVM có bind được với các function do user viết ko?const {NodeVM} = require('vm2'); const vm = new NodeVM({ console: 'inherit', sandbox: {}, require: { external: true, builtin: ['fs', 'path'], root: "./", mock: { fs: { readFileSync() { return 'Nice try!'; } } } } }); // Sync let functionInSandbox = vm.run("module.exports = function(who) { console.log('hello '+ who); }"); functionInSandbox('world'); // Async let functionWithCallbackInSandbox = vm.run("module.exports = function(who, callback) { callback('hello '+ who); }"); functionWithCallbackInSandbox('world', (greeting) => { console.log(greeting); });