nosurf
عبارة عن حزمة HTTP لـ Go تساعدك على منع هجمات تزوير الطلبات عبر المواقع. إنه يعمل كبرنامج وسيط وبالتالي فهو متوافق بشكل أساسي مع أي تطبيق Go HTTP.
على الرغم من أن CSRF يمثل ثغرة أمنية بارزة، إلا أن البنية التحتية لحزمة Go ذات الصلة بالويب تتكون في الغالب من أطر عمل صغيرة لا تنفذ فحوصات CSRF، ولا ينبغي لها ذلك.
يحل nosurf
هذه المشكلة عن طريق توفير CSRFHandler
الذي يغلف http.Handler
الخاص بك ويتحقق من هجمات CSRF على كل طريقة غير آمنة (غير GET/HEAD/OPTIONS/TRACE).
يتطلب nosurf
الإصدار 1.1 أو الأحدث.
يدعم أي http.Handler
(أطر العمل، ومعالجاتك الخاصة، وما إلى ذلك) ويعمل كواحد بحد ذاته.
يسمح بإعفاء نقاط نهاية محددة من عمليات فحص CSRF بواسطة عنوان URL الدقيق أو الكرة الأرضية أو التعبير العادي.
يسمح بتحديد معالج الفشل الخاص بك. هل ترغب في تقديم الإصبع الأوسط للمتسلل باستخدام ASCII بدلاً من HTTP 400
القديم العادي؟ لا مشكلة.
يستخدم الرموز المميزة المقنعة للتخفيف من هجوم BREACH.
ليس لديه أي تبعيات خارج مكتبة Go القياسية.
package 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) {context := make(map[string]string)context["token"] = nosurf.Token(r)if r.Method == "POST" {context["name"] = r.FormValue("name") }temple.Execute(ث، سياق) }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(pattern string)func (h *CSRFHandler) ExemptGlobs(patterns...string)func (h *CSRFHandler) ExemptPath(path string)func (h *CSRFHandler) ExemptPaths(paths ...string)func (h *CSRFHandler) ExemptRegexp(re Interface{})func (h *CSRFHandler) ExemptRegexps(res ...interface{})
لاحقًا، يجب التحقق من الرمز المميز عن طريق الحصول على الرمز المميز يدويًا من ملف تعريف الارتباط وتوفير الرمز المميز المرسل في النص من خلال: VerifyToken(tkn, tkn2 string) bool
.
مثال:
func HandleJson(w http.ResponseWriter, r *http.Request) {d:= struct{X,Y intTkn string }{}json.Unmarshal(ioutil.ReadAll(r.Body), &d)if !nosurf.VerifyToken(nosurf.Token(r), d.Tkn) {http.Errorf(w, "رمز CSRF غير صحيح"، http. طلب الحالة سيئة) العودة }// افعل شيئًا رائعًا}
ابحث عن مشكلة تزعجك / افتح مشكلة جديدة.
يناقش.
تفرع، ارتكب، اختبر.
قم بتقديم طلب سحب/أرفق الالتزامات بالمشكلة.