3 回答

TA貢獻1810條經驗 獲得超5個贊
您可以參考這篇文章進行 SPF 查找。
https://ashish.one/gist/spf-lookup-in-go/
在此,它使用了這個 DNS 庫:
正如您在問題中提到的那樣,SPF 查找只不過是獲取TXT Records
和搜索字符串。v=spf1
它也是這樣做的。
您可以使用任何適合您要求的模塊,并且可以對其進行更改。如果您發(fā)現(xiàn)您的更改也會對其他人有所幫助并且它更通用,那么您應該為特定的 git repo 提出 PR(拉取請求)與您的更改。
如果您的更改僅限于您的要求,那么您應該只使用該代碼供您使用。最好使用 fork,您可以通過更改維護自己的 repo。
如果您不采取任何 fork 并且仍在使用原始項目,那么將來將很難更新特定的庫。

TA貢獻1757條經驗 獲得超8個贊
我想了幾分鐘來回答這個問題。這樣做的原因是您顯然希望我們?yōu)槟喿x該模塊代碼并提出解決方案。老實說,這有點像你有“要求”,牽涉到業(yè)務。
但是,其他人可能會從中學習,您必須付出足夠的努力才能使代碼足夠健壯(IPv6,有人嗎?)。
基本上,您有兩個問題:“如何獲取域的 SPF 記錄并在有時返回它?” 和“如何正確處理 github(或一般基于 git 的代碼托管商)上的代碼提交?”
如何獲取域的 SPF 記錄(如果有)?
歸根結底,SPF 是一項利用現(xiàn)有技術的公約。SPF 條目只不過是域中特殊格式的 TXT 資源記錄。
因此,您不需要任何包來查找我們的域是否具有 SPF 條目:
package main
import (
"flag"
"log"
"net"
"os"
"regexp"
)
var domain string
var spfPattern *regexp.Regexp
var verbose bool
func 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)
}
如何正確處理代碼貢獻
如果你看到你認為需要擴展的代碼,或者你發(fā)現(xiàn)了一個錯誤并且想要修復它,你首先想到的應該是fork 原始存儲庫——基本上,你制作它的副本,這樣做的好處是保留提交歷史。
接下來,你克隆你的 fork,并在那個 fork 上做你想做的工作。您應該使用一個或多個分支進行更改。每個提交都應該盡可能原子。理想情況下,庫編譯并且測試在任何提交之前和之后運行。
完成后,您認為您的代碼已準備好發(fā)布,您可以創(chuàng)建一個拉取請求。拉取請求基本上是說“嘿,原始存儲庫的所有者,我已經進行了一些更改并改進了代碼,您可能需要考慮將我的更改合并到原始代碼中!”
現(xiàn)在很多項目都使用一種叫做“gitflow”的分支模型,我強烈建議你記住它,直到你可以用非常高的 BAC 向后唱它。

TA貢獻1744條經驗 獲得超4個贊
我是您正在使用的包的作者https://github.com/mileusna/spf
包有函數(shù) LookupSPF(domain) 將返回 SPF TXT 記錄,請查看文檔https://pkg.go.dev/github.com/mileusna/spf#LookupSPF
對于維護,SPF 是根據最近沒有更新的 RFC 7208 實施的,并且沒有人報告包有任何問題,因此實際上不需要維護。:) 它只是工作,至少滿足我的需要。
順便說一句,我剛剛添加了支持 gor Go 模塊。
如果您有任何問題或建議,請在 GitHub 上發(fā)布。:)
- 3 回答
- 0 關注
- 261 瀏覽
添加回答
舉報