雷音测试过程中的无效防伪错误

问题描述 投票:2回答:2

测试代码:

  (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
2个回答
2
投票

跨站请求伪造,是一种攻击,其中把一个evildooer是在其网站上链接的技巧有人在该网站上的浏览器变成对您的网站的请求。

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

一般的解决方法是让所以没有严重的行为可以给网站的第一个连接上发生的,而是先连接设置令牌头,该服务器希望看到下一个请求。这允许服务器验证请求的链,从而防止CSRF(或XSRF)。

这听起来像,如果你希望你的测试,以申请这项服务,你需要你的请求,首先获取适当的CSRF令牌,然后使之想的测试要求。

既然这样,您的测试正在测试这一呼吁是不是容易受到CSRF,所以这是一个非常有用的测试,你应该保持它,并另写那得到的发出请求之前,正确的令牌。


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))))
© www.soinside.com 2019 - 2024. All rights reserved.