simple csrf protection

This commit is contained in:
Nazar Kanaev 2021-01-04 14:15:28 +00:00
parent fa0237b546
commit d6c2ba5812
2 changed files with 13 additions and 2 deletions

View File

@ -2,9 +2,12 @@
(function() { (function() {
var api = function(method, endpoint, data) { var api = function(method, endpoint, data) {
var headers = {'Content-Type': 'application/json'}
if (['get', 'post', 'put'].indexOf(method) !== -1)
headers['x-requested-by'] = 'yarr'
return fetch(endpoint, { return fetch(endpoint, {
method: method, method: method,
headers: {'Content-Type': 'application/json'}, headers: headers,
body: JSON.stringify(data), body: JSON.stringify(data),
}) })
} }
@ -12,7 +15,7 @@
var json = function(res) { var json = function(res) {
return res.json() return res.json()
} }
var param = function(query) { var param = function(query) {
if (!query) return '' if (!query) return ''
return '?' + Object.keys(query).map(function(key) { return '?' + Object.keys(query).map(function(key) {

View File

@ -43,6 +43,10 @@ func (h *Handler) Start() {
} }
} }
func unsafeMethod(method string) bool {
return method == "POST" || method == "PUT" || method == "DELETE"
}
func (h Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { func (h Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
route, vars := getRoute(req) route, vars := getRoute(req)
if route == nil { if route == nil {
@ -51,6 +55,10 @@ func (h Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
} }
if h.requiresAuth() && !route.manualAuth { if h.requiresAuth() && !route.manualAuth {
if unsafeMethod(req.Method) && req.Header.Get("X-Requested-By") != "yarr" {
rw.WriteHeader(http.StatusUnauthorized)
return
}
if !userIsAuthenticated(req, h.Username, h.Password) { if !userIsAuthenticated(req, h.Username, h.Password) {
rw.WriteHeader(http.StatusUnauthorized) rw.WriteHeader(http.StatusUnauthorized)
return return