前言:
我有一个带有表单和文本字段的网页。
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/