2012-08-24 2 views
-1

가장 강력한 CSRF 보호 사이에는 토큰 보호 형식이 있습니다. 이 메서드에 대한 질문은 유용성에 대한 것입니다. 사용자가 토큰을 사용하는 폼이 포함 된 여러 페이지를 여는 경우 여러 토큰이 생성되지만 마지막으로 열린 페이지 만 성공적으로 폼을 보낼 수 있고 다른 모든 페이지에서 오류가 발생합니다. .CSRF 보호 및 사용 편리 성

  1. 세션의 모든 기간에 대해 고유 한 토큰을 유지 :

    나는이 개 솔루션을 생각했다.
  2. 생성 된 모든 토큰을 세션에 저장하십시오.

그러나이 : ​​

  1. 이 더 현실적인 솔루션이지만, 덜 안전합니다.
  2. 이렇게하면 많은 리소스 오버 헤드가 발생합니다. 사용자가 여러 페이지를 열 수 있고 생성 된 토큰을 모두 저장해야하기 때문입니다.

따라서이 질문을 어떻게 풀 았습니까?

추신 : 내가 개발중인 웹 사이트는 실제적으로 PHP로 전자 상거래가되며 페이팔 같은 외부 제공 업체를 통해 송금액이 관리되지만 내 서비스에 대한 올바른 안전을 보장한다고 생각합니다.

답변

2

데이터베이스에 토큰을 저장할 필요가 없습니다.

대신 동일한 토큰을 쿠키에 포함해야합니다. 사이트 간 공격자는 쿠키를 읽거나 설정할 수 없습니다.
게시 된 양식과 동일한 토큰을 쿠키에 사용하는 한 안전합니다.

보안을 강화하려면 키가있는 HMAC 해시로 해시 한 다음 해시가 서버에서 온 것인지 확인하십시오.
사용자 당 토큰을 만들 수도 있습니다.

+0

답변을 주셔서 감사합니다. 토큰은 이미 사용자의 세션에 저장되어 있지만 세션 데이터는 데이터베이스에 저장됩니다. 토큰은 무작위로 생성 된 문자열이므로 계산이 실제로 불가능합니다. 따라서 HMAC 해시 유틸리티는 무엇입니까? 고유 한 사용자 별 토큰을 유지하고, 폼별로 표시된 토큰보다 안전하지 않습니까? "사용자 당 토큰을 만들 수도 있습니다"라고 생각하면 그렇지 않습니다. 그렇지 않은 경우 보안은 어디에 있습니까? – Eghes

+1

@Eghes : 해시는별로 좋지는 않지만 아무런 해를 끼치 지 않습니다. 사용자별로 토큰에 사용자 ID를 포함 시키면 (스왑 핑을 방지하기 위해 해시 됨) 공격자가 토큰을 읽거나 쓸 수있을지라도 그는 여전히 해당 ID를 가져와야합니다. (다른 ID 또는 GUID를 사용하면 더 잘 작동합니다.) – SLaks

+0

감사합니다. 그러나 결국, 모든 사용자 세션에 대해 단일 토큰을 사용하는 것이 좋습니다. – Eghes

관련 문제