【问题标题】:Verify a url is where it is going Swift验证一个 url 是它要去的地方 Swift
【发布时间】:2017-06-02 21:12:04
【问题描述】:

在我的应用程序中,我试图让人们能够输入指向 facebook 和 youtube 的链接。我的目标是确保他们输入的链接实际上是 facebook 和 youtube。我遇到了想办法有效解决这个问题的问题。 Facebook 有多个子域,例如“www.facebook.com”和“www.fb.com”。 Youtube 有多个域,例如“www.youtube.com 和“https://youtu.be/”。我将如何验证他们拥有的链接实际上是指向这些子域中的任何一个?

我目前的情况是这样的:

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?任何帮助将不胜感激!

【问题讨论】:

  • 如果有人粘贴一个小网址怎么办?

标签: arrays swift loops for-loop swift3


【解决方案1】:

所以你有一个你信任的主机的明确列表:

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 是您避免所有有关“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”地址,例如“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 }
}

(但除非你真的需要这种灵活性,否则我会使用显式方法。)

【讨论】:

  • 非常感谢,这个解释得很漂亮!
猜你喜欢
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2020-07-29
相关资源
最近更新 更多