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

Введение:

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

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

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

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

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

Я ищу правильный/канонический/ "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) (Objective-C). Я нахожусь на MacOS X, поэтому я использую классы NSString и NSUserDefaults (но простое решение C было бы хорошо для меня, предположил, что я 'll в конечном итоге с массивом unichars)

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

Вопрос (ы)

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

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

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

1 ответ

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

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

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:(**********) i];
 printf("%d\n",c);
 }
 return 0;
}

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

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

В инструмент оказалось правильно, как пара * unichars

55348 56606

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

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

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

licensed under cc by-sa 3.0 with attribution.