2017-04-07 4 views
3

링 위조 토큰이 생성되거나 HTML 페이지에 삽입 될 때를 이해하려고합니다. 나는 Compojure/ring/딸꾹질을 사용하고있다.하지만 나는 내 질문에 대해 정말로 생각하고있다. 나는 그 자체로 어떤 문제도 없습니다. 나는 위조 방지 토큰이 언제 그리고 어떻게 "주입"되는지를 알고 싶습니다.링 위조 토큰은 언제 삽입됩니까?

ring.util.anti-forgery에서 anti-forgery-field 기능은 다음과 같이 구현됩니다 : 나는 REPL에서이 함수를 호출하면

(html (hidden-field "__anti-forgery-token" *anti-forgery-token*) 

내가 얻을 : 아직도

REPL> (println (anti-forgery-field)) 
<input id="__anti-forgery-token" name="__anti-forgery-token" type="hidden" value="Unbound: #&apos;ring.middleware.anti-forgery/*anti-forgery-token*" /> 

을 REPL에서, 나는이를 얻기 위해 시도하는 경우 var 나는 동일한 "언 바운드"변수를 얻습니다.

> ring.middleware.anti-forgery/*anti-forgery-token* 
=> #object[clojure.lang.Var$Unbound 0x1eae055 "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*"] 

그 "언 바운드"가치가 전달 된 실제 토큰으로 (링에 의해) 변형되었을 때도 이해할 수 없다. 특히 웹 사이트에 연결하는 여러 사용자가 각 토큰 (세션별로)을 얻는 방법을 이해하지 못합니다.

해당 변수는 항상 "언 바운드"입니까? 언제/어떻게 그것이 "바운드 (bound)"가 되는가? 또한

, 나는 링 세션 ID를 가지고있는 경우 (예를 들어 "링 세션 = 310678be - 9ef6-41a7-A12A-b2417de4a79f") I는 서버 측에서합니다 (Clojure의 REPL에서 볼 수있는 방법,), 해당 위조 토큰의 값은?

+0

는 https://github.com/ring-clojure에서 소스를 읽어보십시오 /ring-anti-forgery/blob/master/src/ring/middleware/anti_forgery.clj, 특별히 멋진 것은 없습니다. 일단 당신이 그 일을 마쳤다면, 그 메커니즘에 대해 특별한 질문이 있다면, 그것은 아마도 좋은 질문이 될 것입니다. – amalloy

+0

@amalloy : 음, 이미 읽었을뿐입니다. 그리고 이것은 * ring *뿐만 아니라 Clojure (소스를 사용하는 것이 왜 도움이되지 않았고 왜이 질문을했는지 설명 할 것입니다)를 이해하지 못하기 때문에 발생하지 않을 수 있습니다. 나는 대답이 다음과 같은 메커니즘을 이해하는 데 도움이되는 질문이라고 생각합니다. * "REPL에서 2 명의 사용자가 내 웹 사이트에 로그인하고 링 세션 ID를 알고있는 경우 어떻게 두 가지 위조 토큰을 읽을 수 있습니까?" *. 이것은 내가 두포의 상황을 이해하는 데 정말로 도움이 될 것입니다. –

답변

3

개별 요청의 컨텍스트 (동적 환경, 현재 스택)에만 바인딩됩니다. 스레드 로컬 변수/바인딩이라고 생각하면됩니다. REPL에서 응용 프로그램 상태를 보면서 요청 컨텍스트에 있지 않습니다.

각 사용자마다 다른 값이어야하므로이 방법이어야합니다. 이런 종류의 동적 환경 제어를 허용하지 않는 환경에서 작업하는 경우 명시 적 조회 호출을 통해 비슷한 동작을 시뮬레이션 할 수 있습니다. 다음은 올바른 세션 값에 바인딩

은 현재 여기에, 요청시 미들웨어 년에 설립되어

https://github.com/weavejester/ring-anti-forgery/blob/master/src/ring/middleware/anti_forgery.clj#L67

(binding [*anti-forgery-token* (session-token request)] 
    ;; ... 
) 
+0

오, 그건 완전히 새로운 것입니다. 당신의 설명에 감사드립니다 : 지금은 덜 신비스럽고 REPL로부터 이것을 "언 바운드"로 보았던 이유를 이해합니다. –