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

标签 php javascript objective-c encoding shell-exec

前言:

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

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

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

3) shell C 工具将 argc 解析为一个单字符数组(在我当前的实现中实际上是一个 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 解决方案对我也有好处,假设我最终会得到一个单字符数组)

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

问题

这样好吗?

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

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

我在 Mac OS X 上测试过 - Firefox 在客户端 - Mac OS X - Mamp 在服务器端。

关于php - 将字符串从网页传递到 php,然后传递到 Obj-C 命令行工具的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14156403/

相关文章:

php 选择特定日期及其之间的所有预订

php - 克隆表行在 php 中失败,但通过 sql shell 成功

javascript - 每 1 秒调用 jQuery ajax 是否安全

javascript - 当开发者控制台在 chrome 中打开时,为什么 onmouseover 停止工作?

javascript - 如何使用 javascript 获取自定义 css var 的内联样式

objective-c - 当前位置权限对话框消失得太快

php - 如何隐藏/禁用 HTML 中的内容

javascript - 以编程方式单击 AngularJS 指令中单元测试中的 <A>

iphone - 通过通知执行选择器OnMainThread

ios - AWS Cognito Credentials Provider for IOS - 访问 key 和 secret key 为零