如何在 golang 中进行 spf 记录查找和检查?

我需要进行域 spf 查找并返回 PASS / FAIL 如果失败,我需要返回 SPF 记录以进行进一步诊断


github上似乎有很多用于SPF检查的golang模块,但它们似乎都没有维护还有什么是“官方”支持的模块使用


这是我的代码,请评论


package main


import (

    "fmt"

    "io/ioutil"

    "log"

    "net"

    "os"


    "github.com/mileusna/spf"

)


func main() {

    domain := os.Args[1]

    log.SetOutput(ioutil.Discard)   // If I dont do this there are a lot of debug logs 

    ip := net.ParseIP("1.2.3.4")

    r := spf.CheckHost(ip, domain, "", "")

    fmt.Printf("Domain = %s\nSPF=%s", domain, r.String())   // I need to return the value , 

                                                           // How do I get the spf record 


}

如果我下载 github 模块并更改源代码是个好主意吗?


缥缈止盈
浏览 218回答 3
3回答

森栏

您可以参考这篇文章进行 SPF 查找。https://ashish.one/gist/spf-lookup-in-go/在此,它使用了这个 DNS 库:https://github.com/miekg/dns正如您在问题中提到的那样,SPF 查找只不过是获取TXT Records和搜索字符串。v=spf1它也是这样做的。您可以使用任何适合您要求的模块,并且可以对其进行更改。如果您发现您的更改也会对其他人有所帮助并且它更通用,那么您应该为特定的 git repo 提出 PR(拉取请求)与您的更改。如果您的更改仅限于您的要求,那么您应该只使用该代码供您使用。最好使用 fork,您可以通过更改维护自己的 repo。如果您不采取任何 fork 并且仍在使用原始项目,那么将来将很难更新特定的库。

陪伴而非守候

我想了几分钟来回答这个问题。这样做的原因是您显然希望我们为您阅读该模块代码并提出解决方案。老实说,这有点像你有“要求”,牵涉到业务。但是,其他人可能会从中学习,您必须付出足够的努力才能使代码足够健壮(IPv6,有人吗?)。基本上,您有两个问题:“如何获取域的 SPF 记录并在有时返回它?” 和“如何正确处理 github(或一般基于 git 的代码托管商)上的代码提交?”如何获取域的 SPF 记录(如果有)?归根结底,SPF 是一项利用现有技术的公约。SPF 条目只不过是域中特殊格式的 TXT 资源记录。因此,您不需要任何包来查找我们的域是否具有 SPF 条目:package mainimport (    "flag"    "log"    "net"    "os"    "regexp")var domain stringvar spfPattern *regexp.Regexpvar verbose boolfunc init() {    // some flags to make the problem more usable.    flag.StringVar(&domain, "domain", "", "the domain to check for SPF records")    flag.BoolVar(&verbose, "verbose", false, "print moar!")    // Obviously, this is a very, very simple pattern.    // It lacks any true validation whether the TXT record    // is in fact a valid SPF. Expanding the regex should    // not be too hard and I leave it up to you.    spfPattern = regexp.MustCompile(`\s*v=spf1.*`)}func main() {    flag.Parse()    // Lookup ALL resource records rs of type TXT for domain.    rs, err := net.LookupTXT(domain)    // If there was an error accessing the TXT records...    if err != nil {        // ...we inform the user and...        log.Printf("accessing TXT records for %s", err)        // ...inform the caller that something went wrong.        os.Exit(1)    }    // Now we have all TXT records for the domain we iterate through them...    for _, rr := range rs {        // ... and if one of them matches the pattern of an SPF record...        if spfPattern.MatchString(rr) {            // ...we inform the user if the user requested it...            if verbose {                log.Printf("%s has a valid SPFv1 record: %s", domain, rr)            }            // ...or simply inform the caller, as per the UNIX convention            // "No news is good news!"            os.Exit(0)        }    }    // We have iterated through all TXT records and did not find matching    // the pattern of an SPF record, so we need to inform both the user...    log.Println("No valid SPF record found.")    // ...and the caller.    os.Exit(2)}如何正确处理代码贡献如果你看到你认为需要扩展的代码,或者你发现了一个错误并且想要修复它,你首先想到的应该是fork 原始存储库——基本上,你制作它的副本,这样做的好处是保留提交历史。接下来,你克隆你的 fork,并在那个 fork 上做你想做的工作。您应该使用一个或多个分支进行更改。每个提交都应该尽可能原子。理想情况下,库编译并且测试在任何提交之前和之后运行。完成后,您认为您的代码已准备好发布,您可以创建一个拉取请求。拉取请求基本上是说“嘿,原始存储库的所有者,我已经进行了一些更改并改进了代码,您可能需要考虑将我的更改合并到原始代码中!”现在很多项目都使用一种叫做“gitflow”的分支模型,我强烈建议你记住它,直到你可以用非常高的 BAC 向后唱它。

慕无忌1623718

我是您正在使用的包的作者https://github.com/mileusna/spf包有函数 LookupSPF(domain) 将返回 SPF TXT 记录,请查看文档https://pkg.go.dev/github.com/mileusna/spf#LookupSPF对于维护,SPF 是根据最近没有更新的 RFC 7208 实施的,并且没有人报告包有任何问题,因此实际上不需要维护。:) 它只是工作,至少满足我的需要。顺便说一句,我刚刚添加了支持 gor Go 模块。如果您有任何问题或建议,请在 GitHub 上发布。:)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go