帮助解密iPhone应用程序代码

3

能有人帮我解密这段代码吗?它在用户按下按钮提交数据时执行,或者在这种情况下,在iPhone应用程序中提交“问题”。

我知道它正在将字符串发送到托管在服务器上的phpscript.php,但我不熟悉发生的一长串命令。

NSUserDefaults *p = [NSUserDefaults standardUserDefaults];
[p setObject:[NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://website.com/phpscript.php?user=%@&pass=%@&cat=%@&sub=%@&body=%@",[[p valueForKey:@"user"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],[[p valueForKey:@"pass"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],sport,@"",[[tvQ.text stringByReplacingOccurrencesOfString:@"\n" withString:@" "] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]]] forKey:@"q"];

11
太可怕了。写这个东西的人需要咨询辅导。 - Adam Eberbach
这段代码只是说明为什么软件应该写成人类可读的。是的,它能工作,是的,它只有一行,并且没有很多一次性变量,但它是不可维护的。在这个快速优化编译器的时代,它可能甚至不是高效的。谁写的这段代码只是想证明他/她是一个顶尖的程序员。 - Abizern
1
我的开发人员完成了这个应用程序,然后我接手了。现在正在努力弄清楚并整理事情。 - BigMike
3
哇...我很惊讶他没有把所有内容都放在一行,用[NSUserDefaults standardUserDefaults]替换p - dreamlax
2
@BigMike: 所以你接手是因为你开除了你的开发人员? - JeremyP
@jeremy - 是的,那就是情况。 - BigMike
2个回答

8
将其细分会使它变得更容易理解。
NSUserDefaults *p = [NSUserDefaults standardUserDefaults];
NSString* string1 = [[p valueForKey:@"user"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* string2 = [[p valueForKey:@"pass"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* string3 = [[tvQ.text stringByReplacingOccurrencesOfString:@"\n" withString:@" "] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* urlString = [NSString stringWithFormat:@"http://website.com/phpscript.php?user=%@&pass=%@&cat=%@&sub=%@&body=%@",string1,string2,sport,@"",string3];
id val1 = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString]];
[p setObject:val1 forKey:@"q"];

所以p是从用户默认加载的字典对象,看起来像是上次运行应用程序时保存的一些登录凭据。

stringByAddingPercentEscapesUsingEncoding是一个标准方法,使得发送类似于' '(空格)或'%'等字符的请求安全。它被应用于字符串,以确保请求能够到达服务器,看起来与预期的一样。

String1和String2可能是用户名和密码。String3是查询的主体。

当URL被构建时,它执行由urlString表示的查询(希望整个代码块已经在辅助线程上)。查询结果存储在字典p中,并可以通过键@"q"访问。

显式处理&:

[myString replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:wholeString];

这种方法适用于任何字符串 - 如果它被应用到同一个字符串两次,那么第二次将不会起作用。


Adam,这太棒了。谢谢你。这里有没有地方可以让它接受和号(&),以便我可以将其传递给我的php脚本?我看到它正在编码其他特殊字符。 - BigMike
在https://dev59.com/8nRB5IYBdhLWcg3wJUeu中,Roger Nolan提供了一个代码示例,可以处理stringByAddingPercentEscapesUsingEncoding无法处理的所有内容。但是如果你只想要'&' - 你可以使用"%26"。请参见答案中添加的代码行。 - Adam Eberbach
Adam,抱歉我不是很在行,但如果我想尽量全面地了解Roger Nolan的示例,在您提供的干净代码中应该在哪里插入"NSMutableString *escaped"代码示例呢? - BigMike
假设您有一些普通文本。使用类似NSString* myString = [NSString stringWithFormat:@"%s" myOrdinaryASCIITextString]的方法将其转换为NSString。然后,您可以使用replaceOccurrencesOfString方法进行替换。接下来,该字符串就可以发送了。在示例中,您可能会将其作为string3的一部分,或将其附加到string3中。 - Adam Eberbach
Mike,你需要嵌套它们。NSString* myNewString = [[[myString operation1] operation2] operation3];重要的是要知道这些字符串方法的输出是一个字符串。 - Adam Eberbach
显示剩余2条评论

3

这段代码将tvQ.text转换为字符串,并将其中的换行符替换为空格。接着,它使用上述字符串和其他抓取到的值(从用户默认设置中获取)创建URL字符串。然后,在该URL字符串中修复百分号转义,并从NSString创建NSURL对象。最后,将此NSURL对象设置为用户默认设置中键“q”的对象。

这让我感到头疼。


是的,我的头已经痛了。有没有办法解决这个问题?我遇到一个问题,即 ampersand (&) 没有传递到我的 PHP 脚本中,该脚本随后插入我的数据库。字符串被截断了。例如,如果我在应用程序中键入“hello & goodbye”,它最终只会传递“hello”到我的脚本中,然后将其放入数据库中。 - BigMike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接