2017-06-02 38 views
1

在我的应用程序中,我试图让人们能够输入到Facebook和YouTube的链接。我的目标是确保他们输入的链接实际上是对于facebook & youtube。我正在讨论如何有效地去做这件事。 Facebook拥有多个子域名,例如“www.facebook.com”&“www.fb.com”。 YouTube有多个域名,如“www.youtube.com &” https://youtu.be/”我怎么会去核实他们的链接实际上是到这些子域的验证一个网址是它要去的地方Swift

什么我到目前为止是这样的:?

let possibleLinks = ["www.facebook.com", "www.fb.com", "www.youtube.com", "https://youtu.be/"] 

func verifyLinks(LinkType:String, linkURL:String) { 

    for url in possibleLinks { 
     if url != linkURL { 
      print("This link doesn't match our records of urls - (\(url))") 
      break 

     } 
    } 
} 

我正在努力研究如何有效地解决这个问题我最大的问题是由于每个字符串的长度不同而导致“fb”是2个字符,“facebook”是6。有没有一种方法可以消除“www”“.com”“https”?&如果是的话,那么会出现“youtu.be”的问题吗?B/C没有.com?任何帮助都会很感激d it!

+0

如果有人粘贴一个小网址会怎么样? – onnoweb

回答

1

所以,你有主机的显式列表您信任:

let validHosts = ["www.facebook.com", "www.fb.com", "www.youtube.com", "youtu.be"] 

而且你有一个网址,你要检查:

let url = URL(string: "https://www.facebook.com/mycontent/is/here")! 

使用这里的URL是你如何避免所有问题关于“https”等。当您指的是URL时,不要使用字符串。

所以你只需要确保URL的主机是在您的有效列表:

func isValid(url: URL) -> Bool { 
    guard let host = url.host else { return false } 
    return validHosts.contains(host) 
} 

这是最明确的方式,但它意味着,如果有人使用“facebook.com”这是行不通的。你可以在你的列表中加入你支持的选项,这是迄今为止最安全的方法和我的建议。如果您允许用户链接到它,那么facebook.com中可能会有一些服务可以被利用(例如重定向器)。

这就是说,这是一个有用的回答。您如何接受任何“fb.com”地址,如“fb.com”,“www.fb.com”和“messenger.fb.com”,但不接受“bobfb.com”?我们可以通过将主机分解成其反向DNS组件来确保主机匹配可信任主机的长度。

首先,我们会做一个助手返回reverseDNSComponents:

extension String { 
    var reverseDNSComponents: [String] { 
     return components(separatedBy: ".").reversed() 
    } 
} 

而且我们将存储在该格式我们有效列表:

let validDomainComponents = ["facebook.com", "fb.com", "youtube.com", "youtu.be"] 
    .map { $0.reverseDNSComponents } 

现在我们可以测试我们的东西'重新手:

func isValid(url: URL) -> Bool { 
    guard let host = url.host else { return false } 

    let urlDomainComponents = host.reverseDNSComponents 

    // Make sure that the suffix of the host is in the list of valid domains 
    return validDomainComponents 
     .contains { Array(urlDomainComponents.prefix($0.count)) == $0 } 
} 

(但除非你真的需要这种灵活性,我会用明确的方法。)

+0

非常感谢,这是精美的解释! – AndrewS