Правильное экранирование символов для выполнения оболочки из 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
?