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 @@!


  • Global Moderator

    @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:

    Tech-nông
    Email: [email protected]
    Profile: about.me/vunb
    Github: github.com/vunb
    Twitter: @nhubaovu

    0


  • 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


  • Global Moderator

    @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);
    });
    

    Tech-nông
    Email: [email protected]
    Profile: about.me/vunb
    Github: github.com/vunb
    Twitter: @nhubaovu

    0

Log in to reply