2017-06-02 36 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