安全地发送base64编码的字符串作为查询参数

时间:2017-11-28 09:28:03

标签: swift base64 urlencode

在我的应用中,我需要将一个base64编码的字符串作为查询参数发送到服务器,例如。

&data=AwGZnyx+JUi0PFJoyYSEDpgtlrxP(cut...)==

问题是,当我的字符串中没有加号时,任何工作都可以正常工作:另一方面,每次有一个加号时,服务器代码的行为都不正确。

我注意到有逃避函数(例如。addingPercentEncoding),但它们不适用于加号。

除了“手动”删除所有优点(例如使用正则表达式)之外,还有什么我可以做的吗?

如果我使用的话,目前一切正常:

string.replacingOccurrences(of: "+", with: "%2B")

2 个答案:

答案 0 :(得分:1)

服务器可能将+符号解释为空格,因为它通常在查询参数中用作空格的替代。 addPercentEncoding不会对您有所帮助,因为它只会翻译非ASCII字符。

您需要手动将+替换为%2B

....虽然

NSString的{​​{3}}版本也需要CharacterSet作为参数。所以你可以使用addPercentEncoding创建一个除了+之外的所有base64字符的Characterset,即

let safeChars = Characterset(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrtuvwxyz0123456789/=")

答案 1 :(得分:1)

构建网址的一个好方法是使用URLComponents。这应该适用于几乎所有情况,下面显示了一个示例:

let base64 = "AwGZnyx+JUi0PFJoyYSEDpgtlrxP(cut...)=="
var components = URLComponents(string: "https://example.com")
components?.queryItems = [ URLQueryItem(name: "data", value: "AwGZnyx+JUi0PFJoyYSEDpgtlrxP(cut...)==") ]

let url = components?.url

<强>结果:

  

https://example.com?data=AwGZnyx+JUi0PFJoyYSEDpgtlrxP(cut...)%3D%3D

但是,在您的特定情况下,似乎服务器未正确处理+,您需要解决与上述问题类似的问题。更好的解决方法是将服务器更改为正确处理URL。

let base64 = "AwGZnyx+JUi0PFJoyYSEDpgtlrxP(cut...)=="
var components = URLComponents(string: "https://example.com")
components?.queryItems = [ URLQueryItem(name: "data", value: base64) ]

let urlString = components?.string.replacingOccurrences(of: "+", with: "%2B")

<强>结果:

  

https://example.com?data=AwGZnyx%252BJUi0PFJoyYSEDpgtlrxP(cut...)%3D%3D