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