|
1 | 1 | (ns ring.middleware.anti-forgery |
2 | 2 | "Ring middleware to prevent CSRF attacks." |
3 | | - (:require [ring.middleware.anti-forgery.strategy :as strategy] |
| 3 | + (:require [clojure.string :as str] |
| 4 | + [ring.middleware.anti-forgery.strategy :as strategy] |
4 | 5 | [ring.middleware.anti-forgery.session :as session])) |
5 | 6 |
|
6 | 7 | (def ^{:doc "Binding that stores an anti-forgery token that must be included |
|
28 | 29 | (= method :get) |
29 | 30 | (= method :options))) |
30 | 31 |
|
31 | | -(defn- valid-request? [strategy request read-token] |
| 32 | +(defn- valid-request? [strategy request read-token safe-header] |
32 | 33 | (or (get-request? request) |
| 34 | + (when safe-header |
| 35 | + (not (str/blank? (get-in request [:headers safe-header])))) |
33 | 36 | (when-let [token (read-token request)] |
34 | 37 | (strategy/valid-token? strategy request token)))) |
35 | 38 |
|
|
72 | 75 | :error-handler - a handler function to call if the anti-forgery token is |
73 | 76 | incorrect or missing |
74 | 77 |
|
| 78 | + :safe-header - a header that, if found on the request, will make this |
| 79 | + middleware treat the request as safe without the need for |
| 80 | + a valid anti-forgery token |
| 81 | +
|
75 | 82 | :strategy - a strategy for creating and validating anti-forgety tokens, |
76 | 83 | which must satisfy the |
77 | 84 | ring.middleware.anti-forgery.strategy/Strategy protocol |
|
85 | 92 | {:pre [(not (and (:error-response options) (:error-handler options)))]} |
86 | 93 | (let [read-token (:read-token options default-request-token) |
87 | 94 | strategy (:strategy options (session/session-strategy)) |
88 | | - error-handler (make-error-handler options)] |
| 95 | + error-handler (make-error-handler options) |
| 96 | + safe-header (some-> (:safe-header options) str/lower-case)] |
89 | 97 | (fn |
90 | 98 | ([request] |
91 | | - (if (valid-request? strategy request read-token) |
| 99 | + (if (valid-request? strategy request read-token safe-header) |
92 | 100 | (let [token (strategy/get-token strategy request)] |
93 | 101 | (binding [*anti-forgery-token* token] |
94 | 102 | (when-let [response (handler (assoc request :anti-forgery-token token))] |
95 | 103 | (strategy/write-token strategy request response token)))) |
96 | 104 | (error-handler request))) |
97 | 105 | ([request respond raise] |
98 | | - (if (valid-request? strategy request read-token) |
| 106 | + (if (valid-request? strategy request read-token safe-header) |
99 | 107 | (let [token (strategy/get-token strategy request)] |
100 | 108 | (binding [*anti-forgery-token* token] |
101 | 109 | (handler (assoc request :anti-forgery-token token) |
|
0 commit comments