验证网址是Swift的位置

时间:2017-06-02 21:12:04

标签: arrays swift loops for-loop swift3

在我的应用程序中,我试图让人们能够输入到facebook和youtube的链接。我的目标是确保他们输入的链接实际上是facebook& YouTube上。我想知道如何有效地解决这个问题。 Facebook有多个子域名,例如" www.facebook.com" &安培; " www.fb.com&#34 ;. Youtube有多个域名,例如" www.youtube.com& " https://youtu.be/&#34 ;.我如何验证他们所拥有的链接实际上是否属于这些子域中的任何一个?

到目前为止,我所拥有的是:

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

        }
    }
}

我正在努力弄清楚如何有效地解决这个问题。我最大的问题是由于每个字符串的长度不同而且#34; fb"是2个字符,& " Facebook和#34;是6.有没有办法消除" www" " .COM" " HTTPS&#34 ;? &安培;如果是这样," youtu.be"会出现问题? B / C没有.com?任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:1)

因此,您有一个明确的信任主机列表:

INSERT INTO validateuser (userid, validated)
SELECT id, 'validated' FROM users

您有一个要检查的网址:

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

在这里使用URL是如何避免所有关于" https"等等。当你的意思是URL时,不要使用String。

因此,您只需要确保该网址的主机位于您的有效列表中:

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

这是最明确的方法,但这意味着如果有人使用" facebook.com"它不会起作用。您可以在列表中包含您支持的替代方案,这是迄今为止最安全的方法和我推荐的方法。如果您允许人们链接到它(例如重定向器),那么facebook.com中的某些服务可能会被利用。

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

首先,我们帮助返回reverseDNSComponents:

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

我们将以这种格式存储我们的有效列表:

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

现在我们可以测试一下我们所做的事情:

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

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