正确的方法从网页传递字符串到PHP然后到Obj-C命令行工具

时间:2013-01-04 11:35:00

标签: php javascript objective-c encoding shell-exec

前言

我有一个带有表单和文本字段的网页。

1)提交时,字段中的文本与ajax一起发送到php脚本(使用GET方法)。

2)php脚本获取文本并将其作为参数传递给shell工具。

3)shell C工具将 argc 解析为unichars数组(实际上是我当前实现中的NSString)

4 .. 5 .. 6 ..然后该工具完成了他的工作,将结果返回到stdout,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)( Objective-C )我在MacOS X上,所以我利用了NSString和NSUserDefaults类(但是普通的C解决方案对我来说也不错,假设我最终会得到一系列的unichars)

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

问题(S)

这是好方法吗?

调用shell_exec时, escapeshellarg 是否安全?

如果用户输入特殊的东西,我会在途中丢失一些角色吗?

1 个答案:

答案 0 :(得分:1)

等待合格的回复,我开始做一些经验测试......

首先我改变了

echo shell_exec( $cmd );

echo $cmd;

查看命令行调用的结果是在表单中输入了各种文本。似乎PHP端的 escapeshellarg 做得很好。

传递给工具的文本似乎始终在单引号之间正确密封,“危险”字符很好地被转义。我发现无法篡改工具调用。

然后我测试了传递的文本,看看是否有东西在某处丢失。

我以这种方式设置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;
}

做了各种尝试。好像一切都好。作为最后一次测试,我以

的形式输入了“MUSICAL SYMBOL G CLEF”

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

结果正确结束了作为一对* unichars的工具

55348 56606

(* 这是一个非常特殊的字符,其代码超过65535,需要用几个代理单元来表示。这是我发现的最边缘的情况)。

无论如何,正如我在开头所说,这些只是经验测试。我不喜欢认为合理的代码是好的只是因为通过了十几个测试。我很高兴收到意见或建议(或警告!)。

我在Mac OS X上进行了测试 - 客户端上的Firefox - Mac OS X - 服务器端的Mamp。