繁体   English   中英

正确的方法从网页传递字符串到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 )我在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是否安全?

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

等待一个称职的回复,我开始做一些经验测试......

首先,我改变了

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM