Я выполняю вызов 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 ...