Как проверить, является ли ввод командной оболочкой Linux или обычным текстовым сообщением в Nodejs? - PullRequest
0 голосов
/ 19 марта 2019

В Node.js есть ли значение для проверки, если текстовое сообщение является командой оболочки linux или обычное сообщение с / без фактического выполнения текста? Пожалуйста, дайте какие-либо предложения.

Ответы [ 3 ]

1 голос
/ 20 марта 2019

Команда оболочки type обнаружит встроенные команды, псевдонимы, функции, внешние команды и т. Д.

child_process = require('child_process')

['lua','foobar'].forEach((cmd) => {
  result = child_process.spawnSync('sh', ['-c', `type ${cmd}`])
  console.log(result.status + '\t' + result.stdout.toString())
})
0       lua is /usr/local/bin/lua

127     foobar: not found

Действительно, злонамеренный ввод все еще является вредоносным.

Вот один из обходных путей: заключите команду в строку type cmd, но вам придется обрабатывать любые кавычки в самой команде

// 1. shell-quote any single quotes in the cmd
cmd = "da$(echo 'hello world')te";      // 'da$(echo \'hello world\')te'
escaped = cmd.replace(/'/g, `'"'"'`);   // 'da$(echo \'"\'"\'hello world\'"\'"\')te'
// 2. in the command string, quote the escaped cmd argument
result = child_process.spawnSync('sh', ['-c', `type '${escaped}'`]);
// .................................................^..........^
console.log(result.status, result.stdout.toString());
127 'da$(echo \'hello world\')te: not found\n'

И включить @ dee'sответ, чтобы найти слово command , вам сначала нужно будет проанализировать любые назначения и / или перенаправления ведущих переменных (https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion) и / или первые открытые скобки или фигурные скобки и / или ..).в основном реализовать парсер sh.

1 голос
/ 20 марта 2019

Это выглядит просто как неправильный дизайн.В общем случае команда Linux может быть любым двоичным файлом в вашем PATH, встроенной оболочкой или псевдонимом.

Вы можете проверить, указывает ли первое слово двоичный файл в вашем пути, но это все равно не решает псевдонимы оболочки.или встроенные модули (вам по крайней мере нужен список встроенных элементов).

А что, если кто-то вводит «текстовое сообщение», которое, как правило, начинается с общего слова, которое также является командой Linux (echo, cat,...)?

Краткий ответ: не делайте этого и не переживайте последствий.

1 голос
/ 19 марта 2019
var commnads = 'alias,apt-get,aptitude,aspell,awk,basename,bc,bg,bind,break,builtin,bzip2,cal,case,cat,cd,cfdisk,chattr,chgrp,chmod,chown,chroot,chkconfig,cksum,cmp,comm,command,continue,cp,cron,crontab,csplit,curl,cut,date,dc,dd,ddrescue,declare,df,diff,diff3,dig,dir,dircolors,dirname,dirs,dmesg,du,echo,egrep,eject,enable,env,eval,exec,exit,expect,expand,export,expr,false,fdformat,fdisk,fg,fgrep,file,find,fmt,fold,for,fsck,ftp,function,fuser,gawk,getopts,grep,groupadd,groupdel,groupmod,groups,gzip,hash,head,history,hostname,htop,iconv,id,if,ifconfig,ifdown,ifup,import,install,iostat,ip,jobs,join,kill,killall,less,let,link,ln,local,locate,logname,logout,look,lpc,lpr,lprm,lsattr,lsblk,ls,lsof,lspci,man,mkdir,mkfifo,mkfile,mknod,mktemp,more,most,mount,mtools,mtr,mv,mmv,nc,netstat,nft,nice,nl,nohup,notify-send,nslookup,open,op,passwd,paste,Perf,ping,pgrep,pkill,popd,pr,printenv,printf,ps,pushd,pv,pwd,quota,quotacheck,ram,rar,rcp,read,readonly,rename,return,rev,rm,rmdir,rsync,screen,scp,sdiff,sed,select,seq,set,shift,shopt,shutdown,sleep,slocate,sort,source,split,ss,ssh,stat,strace,su,sudo,sum,suspend,sync,tail,tar,tee,test,time,timeout,times,touch,top,tput,traceroute,trap,tr,true,tsort,tty,type,ulimit,umask,unalias,uname,unexpand,uniq,units,unrar,unset,unshar,until,useradd,userdel,usermod,users,uuencode,uudecode,vi,vmstat,w,wait,watch,wc,whereis,which,while,who,whoami,write,xargs,xdg-open,xz,yes,zip,.,!!,###'.split(',');

if (commands.some(command => text_to_check.startsWith(command + ' ')))
{
    //code goes here
}
...