Я выполняю вызов curl из ASP с помощью WScript.Оболочка Объект.
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&"""")
Эта команда отправляет запрос curl с добавленным файлом. Содержимое файла исходит из стандартного 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 ...
