前言
我有一个带有表单和文本字段的网页。
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 是否安全?
如果用户输入特殊的东西,我会在途中丢失一些角色吗?
答案 0 :(得分: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,需要用几个代理单元来表示。这是我发现的最边缘的情况)。
无论如何,正如我在开头所说,这些只是经验测试。我不喜欢认为合理的代码是好的只是因为通过了十几个测试。我很高兴收到意见或建议(或警告!)。
我在Mac OS X上进行了测试 - 客户端上的Firefox - Mac OS X - 服务器端的Mamp。