Как проверить, является ли ввод командной оболочкой Linux или обычным текстовым сообщением в Nodejs?

Используйте этот метод расширения: EntityExtensionMethods.cs

public static void UpdateOnSubmit(this Table table, TEntity entity, TEntity original = null)
    where TEntity : class, new()
{
    if (original == null)
    {
        // Create original object with only primary keys set
        original = new TEntity();
        var entityType = typeof(TEntity);
        var dataMembers = table.Context.Mapping.GetMetaType(entityType).DataMembers;
        foreach (var member in dataMembers.Where(m => m.IsPrimaryKey))
        {
            var propValue = entityType.GetProperty(member.Name).GetValue(entity, null);
            entityType.InvokeMember(member.Name, BindingFlags.SetProperty, Type.DefaultBinder,
                original, new[] { propValue });
        }
    }

    // This will update all columns that are not set in 'original' object. For
    // this to work, entity has to have UpdateCheck=Never for all properties except
    // for primary keys. This will update the record without querying it first.
    table.Attach(entity, original);
}

Чтобы использовать его, убедитесь, что объект entity, который вы передаете методу UpdateOnSubmit, имеет все свойства первичного ключа, установленные для записи, которую вы хотите обновить. Этот метод затем обновит запись оставшимися свойствами из объекта entity, не потянув сначала запись.

После вызова UpdateOnSubmit не забудьте вызвать SubmitChanges() для внесения изменений.

0
задан Simranjit Kaur 20 March 2019 в 12:54
поделиться

3 ответа

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
}
0
ответ дан Hagai Wild 20 March 2019 в 12:54
поделиться

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

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

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

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

0
ответ дан dee 20 March 2019 в 12:54
поделиться

Команда оболочки 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'

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

0
ответ дан glenn jackman 20 March 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: