nosurf
เป็นแพ็คเกจ HTTP สำหรับ Go ที่ช่วยคุณป้องกันการโจมตีการปลอมแปลงคำขอข้ามไซต์ มันทำหน้าที่เหมือนมิดเดิลแวร์ดังนั้นจึงเข้ากันได้กับแอปพลิเคชัน Go HTTP ทั่วไป
แม้ว่า CSRF จะเป็นช่องโหว่ที่โดดเด่น แต่โครงสร้างพื้นฐานแพ็คเกจที่เกี่ยวข้องกับเว็บของ Go ส่วนใหญ่ประกอบด้วยไมโครเฟรมเวิร์กที่ไม่ได้ใช้การตรวจสอบ CSRF และไม่ควรทำเช่นนั้น
nosurf
แก้ปัญหานี้ด้วยการจัดเตรียม CSRFHandler
ที่ล้อม http.Handler
ของคุณ และตรวจสอบการโจมตี CSRF ในทุกวิธีที่ไม่ปลอดภัย (ไม่ใช่ GET/HEAD/OPTIONS/TRACE)
nosurf
ต้องใช้ Go 1.1 หรือใหม่กว่า
รองรับ http.Handler
ใดๆ (เฟรมเวิร์ก ตัวจัดการของคุณเอง ฯลฯ) และทำหน้าที่เหมือนเป็นหนึ่งเดียวกัน
อนุญาตให้ยกเว้นจุดสิ้นสุดเฉพาะจากการตรวจสอบ CSRF ด้วย URL ที่ตรงกัน, glob หรือนิพจน์ทั่วไป
อนุญาตให้ระบุตัวจัดการความล้มเหลวของคุณเอง ต้องการนำเสนอแฮกเกอร์ด้วยนิ้วกลาง ASCII แทนที่จะเป็น HTTP 400
แบบเก่าธรรมดาหรือไม่ ไม่มีปัญหา.
ใช้โทเค็นที่ปกปิดเพื่อลดการโจมตี BREACH
ไม่มีการขึ้นต่อกันภายนอกไลบรารีมาตรฐาน Go
แพ็คเกจ mainimport ("fmt""github.com/justinas/nosurf""html/template""net/http")var templateString string = `<!doctype html><html><body>{{ if .name }}< p>ชื่อของคุณ: {{ .name }}</p>{{ end }}<form action="/" method="POST"><input type="text" name="name"><!-- ลองลบสิ่งนี้หรือเปลี่ยนค่าแล้วดูว่าเกิดอะไรขึ้น --><input type="hidden" name="csrf_token" value="{{ .token }}"><input type="submit" value="Send"></form></body></html >`var templ = template.Must(template.New("t1").Parse(templateString))func myFunc(w http.ResponseWriter, r *http.Request) {บริบท := make(map[string]string)context["token"] = nosurf.Token(r)if r.Method == "POST" {context["name"] = r.FormValue("ชื่อ") }tepl.Execute (w, บริบท) }func main() {myHandler := http.HandlerFunc(myFunc)fmt.Println("กำลังฟังบน http://127.0.0.1:8000/")http.ListenAndServe(":8000", nosurf.New(myHandler)) -
ในบางกรณี โทเค็น CSRF อาจถูกส่งด้วยวิธีที่ไม่เป็นมาตรฐาน เช่น เนื้อความหรือคำขอเป็นข้อความที่เข้ารหัส JSON โดยช่องใดช่องหนึ่งเป็นโทเค็น
ในกรณีเช่นนี้ ตัวจัดการ (เส้นทาง) ควรถูกแยกออกจากการตรวจสอบอัตโนมัติโดยใช้วิธียกเว้นวิธีใดวิธีหนึ่ง:
func (h *CSRFHandler) ExemptFunc(fn func(r *http.Request) bool)func (h *CSRFHandler) ExemptGlob(สตริงรูปแบบ)func (h *CSRFHandler) ExemptGlobs(รูปแบบ ...string)func (h *CSRFHandler) ExemptPath(สตริงพาธ)func (h *CSRFHandler) ExemptPaths(พาธ ...สตริง)func (h *CSRFHandler) ExemptRegexp(อินเทอร์เฟซใหม่{})func (h *CSRFHandler) ExemptRegexps(res ...อินเทอร์เฟซ{})
หลังจากนั้น โทเค็น จะต้อง ได้รับการตรวจสอบโดยรับโทเค็นจากคุกกี้ด้วยตนเอง และจัดเตรียมโทเค็นที่ส่งในส่วนเนื้อหาผ่าน: VerifyToken(tkn, tkn2 string) bool
ตัวอย่าง:
func HandleJson (w http.ResponseWriter, r *http.Request) {d := struct {X,Y สตริง intTkn }{}json.Unmarshal(ioutil.ReadAll(r.Body), &d)if !nosurf.VerifyToken(nosurf.Token(r), d.Tkn) {http.Errorf(w, "โทเค็น CSRF ไม่ถูกต้อง", http. StatusBadRequest)กลับมา }// ใจเย็นๆ นะ}
ค้นหาปัญหาที่รบกวนคุณ / เปิดใหม่
หารือ.
แยกสาขาออก กระทำ ทดสอบ
ทำการร้องขอการดึง / แนบคอมมิตกับปัญหา