我创建了NSURL
作为请求发送给我已设置的PHP
休息API
。这是我的代码:
NSMutableString *url = [NSMutableString stringWithFormat:@"http://www.private.com/recievedata.php?item=%@&contact=%@&discovery=%@&summary=%@",__item,__contactDetails,__lostFound,__explain];
//The " ' " in PHP is a special character, so we have to escape it in the URL
//The two slashes are because the "\" itself is a special character in Objective C
NSString *formattedURL = [url stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"];
NSURLSession *session = [NSURLSession sharedSession];
NSURL *address = [NSURL URLWithString:formattedURL];
出于某种原因,每当我尝试使以下网址发生时,地址变量都会保留nil
:
http://www.private.com/recievedata.php?item=hell\'&contact=hell&discovery=lost&summary=hell
我必须添加" \"从我的代码中可以看出,在撇号前面因为PHP需要有" ' "在其网址中转义。但通过这样做,我似乎违反了NSURL
的一些要求。你们觉得怎么样?
答案 0 :(得分:1)
你说:
我必须添加" \"从我的代码中可以看出,在撇号前面因为PHP需要有" ' "在其网址中转义。但通过这样做,我似乎违反了为NSURL规定的一些要求。你们觉得怎么样?
是的,在您的PHP代码中,如果您在字符串值周围使用单引号,则必须转义字符串文字中出现的任何'
个字符。
但不你应该使用\
字符来逃避'
字符的情况,这些字符会出现在您尝试传递到您的网址中的值中请求。 (你也不应该在POST
请求的正文中这样做。)
如果您想要转义这些'
字符,因为您要将这些值插入到SQL语句中,则不应手动转义它们。相反,您应该调用mysqli_real_escape_string
或将值显式绑定到SQL中的?
占位符。永远不要依赖客户端代码来逃避这些值(因为您仍然容易受到SQL注入攻击)。
回到URL中保留字符的编码,这由RFC 3986管理。谨慎的策略是除了无保留字符集中的字符之外的百分比转义。值得注意的是,如果您的值可能包含&
或+
字符,则转义百分比至关重要。
因此,网址查询值中'
字符的正确编码不是\'
,而是%27
。不幸的是,编码stringByAddingPercentEscapesUsingEncoding
不就足够了(因为它会让某些关键字符在值字符串中没有转义)。
历史上,我们使用CFURLCreateStringByAddingPercentEscapes
转义价值百分比(请参阅Urlencode in Objective-C)。 Mac OS 10.9和iOS 7中引入的stringByAddingPercentEncodingWithAllowedCharacters
也可以正常工作(有关可能的字符集的说明,请参阅https://stackoverflow.com/a/24888789/1271826)。