3

前言:

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

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

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

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)(Objective-C)我在 MacOS X 上,所以我利用 NSString 和 NSUserDefaults 类(但一个普通的 C 解决方案对我也有好处,假设我最终会得到一个 unichars 数组)

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

问题)

这是好方法吗?

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

如果用户输入一些特殊的东西,我会不会丢失一些字符?

4

1 回答 1

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,它需要用几个代理 unichars 表示。这是我发现的最极端的情况)。

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

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

于 2013-01-04T19:15:23.473 回答