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


Correct way to pass string from web page, to php and then to Obj-C Command Line Tool

前言:

我有一个网页,里面有一个表单和一个文本字段。

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(我在MacOSX上,所以我利用了NSString和NSUserDefaults类(但普通的C解决方案对我来说也很好,假设我最终会得到一组unichars(

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

问题

这是个好办法吗?

调用shell_exec时,单独使用escapesellarg是否安全?

如果用户键入一些特殊的内容,我会在这一过程中丢失一些字符吗?

等待有能力的回复,我已经开始进行一些经验测试。。。

首先我换了

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;
}

做了各种尝试。似乎一切都好。作为最后一次测试,我以的形式输入了"音乐符号G CLEF">

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

结果正确地作为unichars 的一对*结束到工具中

5534856606

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

不管怎样,正如我在开头所说的,这些只是经验测试。我不喜欢仅仅因为通过了十几次测试就认为合理的代码是好的。我很乐意收到评论或建议(或警告!(。

我在客户端测试了Mac OS X-Firefox,在服务器端测试了Mac OSX-Mamp。