사용자가 웹 사이트에 여러 번 데이터를 게시하지 못하게하는 방법

StackOverflow https://stackoverflow.com/questions/130337

  •  02-07-2019
  •  | 
  •  

문제

웹 응용 프로그램 (J2EE)에서 작업 중이며 브라우저에서 이중 게시물을 처리 할 수있는 옵션을 알고 싶습니다.

과거에보고 사용한 솔루션은 모두 클라이언트 측입니다.

  • 사용자가 클릭하자마자 제출 버튼을 비활성화합니다.
  • 사용자가 뒤로 버튼을 클릭 할 때 게시물을 방지하려면 포스트 레디렉션-get 패턴을 따르십시오.
  • 양식의 OnSubmit 이벤트를 처리하고 JavaScript로 제출 상태를 추적하십시오.

가능하면 서버 측 솔루션을 구현하는 것이 좋습니다. 위에서 언급 한 것보다 더 나은 접근 방식이 있습니까? 아니면 클라이언트 측 솔루션이 가장 좋습니까?

도움이 되었습니까?

해결책

바보 방지 솔루션을 구현하기는 어렵습니다 (바보를 개선하고 있기 때문에). 무엇을하든 클라이언트 측은 조작하거나 잘못 수행 할 수 있습니다.

솔루션은 신뢰할 수 있고 안전하기 위해 서버 측이어야합니다. 즉, 한 가지 방법은 요청을 검토하고 시스템/데이터베이스 상태 또는 로그를 확인하여 이미 처리되었는지 확인하는 것입니다. 이상적으로는 서버 측의 프로세스는 가능하면 edempotent 여야합니다., 그리고 그것은 듀프가 제출할 수 없다면 보호해야합니다.

다른 팁

양식의 일부로 "티켓"을 제공 할 수 있으며, 일부 임의의 숫자는 서버 측에서 두 번 허용되지 않도록해야합니다.

두 가지 서버 측 솔루션이 떠 오릅니다.

  1. 숨겨진 양식 필드에서 일회성 사용 "토큰"을 만듭니다. 일단 토큰을 사용하면 저장하는 데이터베이스 또는 세션 컨텍스트 객체에서 삭제됩니다. 두 번째로 허용되지 않습니다.
  2. 수신 된 캐시 정보 및 특정 기간 내에 동일한 양식이 수신되면 (10 분? 한 시간? 결정!) 무시됩니다.

요청과 함께 요청할 수있는 고유 한 사람을 구현하고 실행과 함께 로그인하십시오. ID가 이미 기록 된 경우 다시는 작업을 수행하지 않습니다. 이것은 폴백 솔루션과 비슷합니다. 버튼 또는 링크 Clientside를 비활성화하고 스스로 제안했을뿐만 아니라

우리는 시간 민감한 한 번의 티켓을 사용합니다. 세션 ID와 같습니다. 그러나 그것은 양식/페이지에 묶여 있습니다.

사용자가 페이지를 제출할 때 티켓을 버리고 유효한 티켓과 함께 제공되는 페이지 만 처리합니다. 동시에 티켓을 사용자에게 첨부하여 보안을 강화할 수 있으므로 티켓이 제출 된 사용자가 제출 한 티켓이 제출 된 경우 티켓이 제출되면 요청을 거부합니다.

Struts에는 사용 중이면 이와 같은 내장이 있습니다.

http://struts.apache.org/1.x/apidocs/org/apache/struts/util/tokenprocessor.html

타임 스탬프를 사용하고 서버 사이드 코드와 값을 비교합니다. 두 개의 타임 스탬프가 충분히 가까이 있고 동일한 IP 주소가있는 경우 두 번째 양식 제출을 무시하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top