CSRF (Cross Site Request Forgery)는 일반적으로 다음 방법 중 하나로 방지됩니다.
- 참조 자 확인-RESTful이지만 신뢰할 수 없음
- 양식에 토큰을 삽입하고 서버 세션에 토큰을 저장하십시오-실제로 RESTful이 아닙니다.
- 암호화 된 일회용 URI-토큰과 같은 이유로 RESTful이 아닙니다.
- 이 요청에 대해 수동으로 비밀번호 보내기 (HTTP 인증에 사용 된 캐시 된 비밀번호가 아님)-RESTful하지만 편리하지 않음
내 생각은 토큰을 생성하기 위해 사용자 비밀, 비밀 스럽지만 정적 인 양식 ID 및 JavaScript를 사용하는 것입니다.
<form method="POST" action="/someresource" id="7099879082361234103">
<input type="hidden" name="token" value="generateToken(...)">
...
</form>
GET /usersecret/john_doe
인증 된 사용자로부터 JavaScript가 가져옵니다.- 응답 :
OK 89070135420357234586534346
이 비밀은 개념적으로는 정적이지만 보안을 향상시키기 위해 매일 / 시간마다 변경할 수 있습니다. 이것은 유일한 기밀입니다. - JavaScript로 암호화 된 (그러나 모든 사용자에게는 정적입니다!) 양식 ID를 읽고 사용자 시크릿과 함께 처리하십시오.
generateToken(7099879082361234103, 89070135420357234586534346)
- 생성 된 토큰과 함께 양식을 서버로 보냅니다.
- 서버는 사용자 시크릿과 폼 ID를 알고 있기 때문에 클라이언트가 두 결과를 전송하고 비교하기 전에했던 것과 동일한 generateToken 함수를 실행할 수 있습니다. 두 값이 동일한 경우에만 작업이 승인됩니다.
JavaScript 없이는 작동하지 않는다는 사실에도 불구하고이 접근 방식에 문제가 있습니까?
추가: