Escapamento adequado de caracteres para execução do shell de ASP / VBScript

0

Estou executando uma chamada curl do ASP com o objeto WScript.Shell.

Set objCmd = objWShell.Exec("cmd.exe /c echo "&dataString&" | /path/to/curl --cacert '/path/to/cert/cacert.pem' -X POST"&options&" -A """&useragent&""""&referer&" -F "&fileParamName&"=@-;type="&fileMIME&";filename=^"""&filename&"^"" --url """&url&"""")

O que este comando faz é enviar uma solicitação de curl com um arquivo anexado. O conteúdo do arquivo vem do stdin (o echo ) para não precisar gravar um arquivo real no disco rígido.

Meu problema é que parece que algumas chamadas não estão funcionando corretamente, por causa dos caracteres no dataString que quebram o comando. O dataString contém JSON com entrada do usuário do banco de dados.
O conteúdo JSON já está codificado para que os caracteres sejam transformados em \b , \t , \n , \f , \r , \" , \/ , \ ou codificados como \uXXXX caracteres, deixando o dataString com esta aparência:

{"field":"User-String with \"encoded\" characters!\r\nSome other characters look like \u00FC or \u00E4.\r\nQuestion Marks?, Exclamation Marks!, 'SingleQuotes' and who knows what!"}

Então ... echo {"field":"..."} | ... seria o String a ser executado.

Eu tentei até agora usar aspas duplas e aspas simples ou escapar com ^ , mas não está funcionando corretamente. Pelo menos se eu tentar simulá-lo com echo String | cat > testfile.txt na minha janela de terminal.

De que personagens eu preciso escapar e como?

Editar:
Desde que eu escolhi a solução do devplayer para a chamada com a transferência de arquivos, você pode pensar que estou pronto. Mas agora eu tenho outro tipo de chamada sem uma transferência de arquivos sem a necessidade de um pipe, mas com o mesmo problema de entrada do usuário que precisa ser escapado corretamente.

É como:

curl ... -d "<properly escaped string>" --url ...
    
por Mumpitz 15.02.2018 / 12:21

1 resposta

0

que tal se você passar o seu longo conteúdo de string como um arquivo para o seu comando? Ou seja armazene seu datastring em um arquivo.txt e alimentar o conteúdo do arquivo para o comando da seguinte forma:

/path/to/curl --cacert '/path/to/cert/cacert.pem' -X POST"&options&" -A """&useragent&""""&referer&" -F "&fileParamName&"=@-;type="&fileMIME&";filename=^"""&filename&"^"" --url """&url&""" < file.txt

?

    
por 15.02.2018 / 12:28