Правильное экранирование символов для выполнения оболочки из ASP / VBScript
1024
Mumpitz
Я выполняю вызов 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&"""")
Эта команда отправляет запрос 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 ...
Это может звучать немного глупо, но есть ли в вашей ОС Windows curl?
dmb 6 лет назад
0
Да, я уже делаю успешные запросы с такой командой
Mumpitz 6 лет назад
0
Ммм, попробуйте ввести пробелы вокруг `&` и для `” `просто используйте двойные кавычки, подобные этой” ”” `
dmb 6 лет назад
0
1 ответ на вопрос
0
devplayer
как насчет того, чтобы передать свою длинную строковую информацию в файл своей команде? Т.е. сохраните вашу строку данных в файле file.txt и передайте содержимое файла команде следующим образом:
Тогда мне нужно будет только указать путь к файлу вместо тире `-`. Нет необходимости в `<file.txt`. Но «Файлов» довольно много, и они очень быстро заполняют жесткий диск. Я ограничен с точки зрения места, поэтому я пытаюсь без фактического файла.
Mumpitz 6 лет назад
0
Вы всегда можете повторно использовать один и тот же файл, не нужно их складывать. Это правда, что это не решение реального вопроса, но это решение проблемы?
devplayer 6 лет назад
0
Это решение, которое я выбрал, но только потому, что оно решило проблему размера. Поскольку это не ответ на вопрос, я не буду отмечать его как принятый ответ. Если сообщество не думает, что это так. ;)
Mumpitz 6 лет назад
0