Правильный способ передачи строки с веб-страницы на php, а затем в инструмент командной строки Obj-C


Предисловие:

У меня есть веб-страница с формой и текстовым полем.

1) При отправке текст в поле отправляется с помощью ajax в php-скрипт (с помощью метода GET).

2) php-скрипт получает текст и передает его в качестве параметра инструменту оболочки.

3) Инструмент shell C анализирует argc в массив unichars (фактически NSString в моей текущей реализации)

(4.. 5.. 6.. затем инструмент выполняет свою работу, возвращает результат в стандартный вывод что php-скрипт служит ответом на веб-страницу...)

Я ищу правильный / канонический / " unicode "способ выполнения каждого шага, чтобы: содержимое было правильно закодировано и сохранено, никаких проблем с безопасностью не возникало.

Что я сейчас делаю:

1) ( JavaScript) текст извлекается из формы таким образом

theText = $('#theField').attr('value');

И отправляется на сервер таким образом

httpReq.open('GET','myScript.php?theText=' + encodeURIComponent(theText),true);

2) ( PHP) Я получаю текст

$theText=(isset($_GET["theText"])?$_GET["theText"]:"");

Я вызываю инструмент C

$cmd = "/usr/bin/thetool -theText ".escapeshellarg($theText);
echo shell_exec( $cmd );

3) ( Цель-C) Я на macOS X, поэтому я использую классы NSString и NSUserDefaults (но простое решение на языке C было бы хорошо и для меня, если предположить, что в итоге я получу массив unichars)

int main(int argc, const char * argv[])
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString       *theText =      [userDefaults stringForKey: @"theText"];

Вопрос(ы)

Это хороший способ?

Безопасен ли один только escapeshellarg при вызове shell_exec?

Потеряю ли я некоторые символы по пути, если пользователь введет что-то особенное?

Author: Paolo, 2013-01-04

1 answers

Ожидая компетентного ответа, я начал проводить некоторые эмпирические тесты...

Сначала я изменил

echo shell_exec( $cmd );

До

echo $cmd;

Чтобы увидеть, каким оказался вызов командной строки, в форму был введен различный текст. Похоже, что escapeshellarg на стороне PHP делает хорошую работу.

Текст, передаваемый Инструменту, кажется, всегда правильно заключен в одинарные кавычки, при этом "опасный" символ хорошо экранирован. Я не нашел способа вмешаться с помощью вызова инструмента.

Затем я проверил переданный текст, чтобы посмотреть, не потерялось ли что-то где-то.

Я настроил инструмент C таким образом и искал выходные данные

int main(int argc, const char * argv[])
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString       *theText =      [userDefaults stringForKey: @"theText"];

    int i;
    unichar c;

    for(i=0;i<[theText length];i++)
    {
        c = [searchString characterAtIndex:(NSUInteger) i];
        printf("%d\n",c);
    }

    return 0;
}

Предпринимал различные попытки. Кажется, все в порядке. В качестве последнего теста я ввел "МУЗЫКАЛЬНЫЙ СИМВОЛ G КЛЮЧ" в виде

Http://www.fileformat.info/info/unicode/char/1d11e/index.htm

Оказалось, что правильно заканчивается в инструменте как пара* уничары

55348 56606

(* будучи этим очень особенным символом, код которого превышает 65535, он должен быть представлен парой суррогатных символов. Это самый крайний случай, который я нашел).

В любом случае, как я уже говорил в начале, это всего лишь эмпирические тесты. Мне не нравится предполагать, что разумный код хорош просто потому, что проходит дюжину тестов. Я был бы очень рад получить комментарии или предложения (или предупреждения!).

Я тестировал на Mac OS X - Firefox на клиентская сторона - Mac OS X - Mamp на стороне сервера.

 1
Author: Paolo, 2013-01-04 19:22:22