Add csrf protection functions
This commit is contained in:
		
							
								
								
									
										60
									
								
								security/csrf.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								security/csrf.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					package security
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"crypto/rand"
 | 
				
			||||||
 | 
						"encoding/hex"
 | 
				
			||||||
 | 
						"log"
 | 
				
			||||||
 | 
						"math"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GenerateCsrfToken generates a csrf token and assigns it to a cookie for double submit cookie csrf protection
 | 
				
			||||||
 | 
					func GenerateCsrfToken(w http.ResponseWriter, r *http.Request) (string, error) {
 | 
				
			||||||
 | 
						// Generate random 64 character string (alpha-numeric)
 | 
				
			||||||
 | 
						buff := make([]byte, int(math.Ceil(float64(64)/2)))
 | 
				
			||||||
 | 
						_, err := rand.Read(buff)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Println("Error creating random buffer for token value")
 | 
				
			||||||
 | 
							log.Println(err)
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						str := hex.EncodeToString(buff)
 | 
				
			||||||
 | 
						token := str[:64]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Create session cookie, containing token
 | 
				
			||||||
 | 
						cookie := &http.Cookie{
 | 
				
			||||||
 | 
							Name:     "csrf",
 | 
				
			||||||
 | 
							Value:    token,
 | 
				
			||||||
 | 
							Path:     "/",
 | 
				
			||||||
 | 
							MaxAge:   1800,
 | 
				
			||||||
 | 
							Expires:  time.Now().Add(24 * time.Hour),
 | 
				
			||||||
 | 
							HttpOnly: true,
 | 
				
			||||||
 | 
							Secure:   true,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						http.SetCookie(w, cookie)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return token, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// VerifyCsrfToken verifies the csrf token
 | 
				
			||||||
 | 
					func VerifyCsrfToken(r *http.Request) (bool, error) {
 | 
				
			||||||
 | 
						// Get csrf cookie
 | 
				
			||||||
 | 
						cookie, err := r.Cookie("csrf")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Println("Error getting csrf cookie")
 | 
				
			||||||
 | 
							log.Println(err)
 | 
				
			||||||
 | 
							return false, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Get csrf token from form
 | 
				
			||||||
 | 
						token := r.FormValue("csrf")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Compare csrf cookie and csrf token
 | 
				
			||||||
 | 
						if cookie.Value == token {
 | 
				
			||||||
 | 
							return true, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user