【问题标题】:Invalid anti-forgery error during lein testlein 测试期间出现无效的防伪错误
【发布时间】:2016-06-01 17:42:14
【问题描述】:

测试代码:

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

prn 响应时的测试错误:

 {: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>"}

【问题讨论】:

  • 你的问题是......?
  • 如何编写测试来测试它?

标签: clojure compojure


【解决方案1】:

Cross Site Request Forgery,是一种攻击,邪恶者在他们的网站上放置一个链接,诱骗该网站上某人的浏览器向您的网站发出请求。

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

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

听起来,如果你想让你的测试向这个服务发出请求,你需要你的请求首先获取一个正确的 CSRF 令牌,然后发出它想要测试的请求。

就目前而言,您的测试正在测试此调用不会受到 CSRF 的攻击,因此这是一个非常有用的测试,您应该保留它,并在发出请求之前编写另一个获取正确令牌的方法。

【讨论】:

    【解决方案2】:

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

    ; 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))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 2015-09-01
      • 2016-05-07
      • 2017-11-12
      • 2019-01-26
      • 1970-01-01
      相关资源
      最近更新 更多