2017-06-02 2 views
1

私のアプリでは、人々がFacebookやYouTubeへのリンクを入力できるようにしようとしています。私の目的は、彼らが入力しているリンクが実際にフェイスブック& youtubeにあることを確認することです。私は効果的にこれをやり遂げる方法を考え出すという問題に遭遇しています。 Facebookには、 "www.facebook.com" & "www.fb.com"のような複数のサブドメインがあります。ユーチューブは、次のような複数のドメインがある「www.youtube.comを&」https://youtu.be/を」どのように私は、彼らが持っているリンクは、これらのサブドメインのいずれかに実際にあることを確認しに行くかURLはどこに行くのかを確認する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はありません?どんな助けでも大いに感謝しますそれ!

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

そして、あなたはあなたがチェックしたいURLを持っている:

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

ここにURLを使用して、あなたがすべての問題を避ける方法をされたので

+0

小さなURLをペーストするとどうなりますか? – onnoweb

答えて

1

あなたが信頼するホストの明示的なリストを持っています「https」などについて。 URLを意味するときにはStringを使用しないでください。

だから、あなただけのURLのホストはあなたの有効なリストであることを確認する必要があります。

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

これは最も明白なアプローチですが、それは、誰かが「facebook.com」を使用している場合はそれを動作させるつもりはない意味。サポートしている選択肢をリストに含めることができます。これは、最も安全な方法と私が推奨するものです。 facebook.comには、人々がそれにリンクすることを許可した場合(例えばリダイレクタ)に悪用される可能性のあるサービスがある可能性があります。

これは、答えると便利なことです。 "fb.com"、 "www.fb.com"、 "messenger.fb.com"のように "bobfb.com"ではなく "fb.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

関連する問題