Правильное экранирование символов для выполнения оболочки из 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 ... 
0
Это может звучать немного глупо, но есть ли в вашей ОС Windows curl? dmb 6 лет назад 0
Да, я уже делаю успешные запросы с такой командой Mumpitz 6 лет назад 0
Ммм, попробуйте ввести пробелы вокруг `&` и для `” `просто используйте двойные кавычки, подобные этой” ”” ` dmb 6 лет назад 0

1 ответ на вопрос

0
devplayer

как насчет того, чтобы передать свою длинную строковую информацию в файл своей команде? Т.е. сохраните вашу строку данных в файле 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 

?

Тогда мне нужно будет только указать путь к файлу вместо тире `-`. Нет необходимости в `<file.txt`. Но «Файлов» довольно много, и они очень быстро заполняют жесткий диск. Я ограничен с точки зрения места, поэтому я пытаюсь без фактического файла. Mumpitz 6 лет назад 0
Вы всегда можете повторно использовать один и тот же файл, не нужно их складывать. Это правда, что это не решение реального вопроса, но это решение проблемы? devplayer 6 лет назад 0
Это решение, которое я выбрал, но только потому, что оно решило проблему размера. Поскольку это не ответ на вопрос, я не буду отмечать его как принятый ответ. Если сообщество не думает, что это так. ;) Mumpitz 6 лет назад 0

Похожие вопросы