在lein测试期间无效的防伪错误

时间:2016-02-20 00:07:16

标签: clojure compojure

测试代码:

  (testing "adding a record"
    (let [response (app (mock/request :post "/api/df"
                                      "{\"id\":123}"))]
      (prn response)
      (is (= (:status response) 200))))

修复回复时测试错误:

 {:status 403, :headers {"Content-Type" "text/html; charset=utf-8", "X-XSS-Protection" "1; mode=block", "X-Frame-Options" "SAMEORIGIN", "X-Content-Type-Options" "nosniff"}, :body "<h1>Invalid anti-forgery token</h1>"}

2 个答案:

答案 0 :(得分:2)

跨站点请求伪造,是一种攻击,恶意者在其网站上放置一个链接,欺骗该网站上某人的浏览器向您的网站发出请求。

如果当时有人碰巧登录到您的网站,那么该请求将导致事情发生,就像他们要求它一样(因为他们的浏览器要求它发生)。这可能是一个非常严重的问题,它会影响GET和POST请求。

一般的解决方案是使其在第一次连接到您的站点时不会发生严重的操作,而是第一个连接设置令牌标头,服务器希望在下一个请求中看到该标头。这允许服务器验证请求链,从而阻止CSRF(或XSRF)。

听起来,如果您希望测试向此服务发出请求,您需要先请求获取正确的CSRF令牌,然后将其要求的请求进行测试。

目前,您的测试是测试此调用不易受CSRF影响,因此它是一个非常有用的测试,您应该保留它,并在发出请求之前编写另一个获得正确令牌的测试。

答案 1 :(得分:0)

我们可以在使用csrf的测试中禁用(assoc site-defaults :security false)。完整的代码如下:

; Create a copy of testing app in utilities.testing
; by wrapping handler with testing middlewares

(ns utilities.testing
    (:require [your-web-app.handler :refer [path-handler]]
              [ring.middleware.defaults :refer [wrap-defaults site-defaults]]))

; Disabling CSRF for testing
(def app
    (-> path-handler
        (wrap-defaults (assoc site-defaults :security false))))

现在您可以在测试中使用此应用了

(ns users.views-test
    (:require [utilities.testing :refer [app]]
              ;...
              ))

;...
  (testing "adding a record"
    (let [response (app (mock/request :post "/api/df"
                                      "{\"id\":123}"))]
      (prn response)
      (is (= (:status response) 200))))