Правильное экранирование символов для выполнения оболочки из ASP/VBScript

Я выполняю вызов curl из ASP с помощью объекта 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&"""")

Эта команда отправляет запрос скручивания с добавленным файлом. Содержание файла исходит от stdin (echo) нет необходимости записывать фактический файл на жесткий диск.

Моя проблема в том, что некоторые вызовы не работают должным образом из-за символов в dataString которые нарушают команду. dataString содержит JSON с пользовательским вводом из базы данных.
Содержимое JSON уже закодировано, поэтому символы преобразуются в \b, \t, \n, \f, \r, \", \/, \\ или закодированы как \uXXXX персонажи, оставляя dataString выглядит так:

{"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!"}

Так ... echo {"field":"..."} | ... будет строка для выполнения.

Я до сих пор пытался использовать двойные кавычки и одинарные кавычки или убежать с ^ но это не работает должным образом. По крайней мере, если я попытаюсь смоделировать это с echo String | cat > testfile.txt в моем терминальном окне.

Каких персонажей мне нужно убежать и как?

Редактировать:
Поскольку я выбрал решение devplayer для звонка с передачей файлов, вы можете подумать, что все готово. Но теперь я получил другой вид вызова без передачи файла и без необходимости конвейера, но с той же проблемой пользовательского ввода, которая должна быть корректно экранирована.

Это как:

curl ... -d "<properly escaped string>" --url ...

1 ответ

Как насчет того, если вы передадите свое длинное строковое содержимое в файл своей команде? Т.е. сохраните вашу строку данных в файле file.txt и передайте содержимое файла команде следующим образом:

/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

?

Другие вопросы по тегам