2010-01-11 6 views
2

투표소에서 SO가 게시물 컨트롤러에 POST하고 URL을 통해 게시물 ID와 투표 유형을 보내고 fkey 매개 변수를 전송하는 XHR 메소드를 구현 한 것으로 나타났습니다. 예 :Stackoverflow와 같은 독특한 사용자 투표를위한 전략은 무엇입니까?

http://stackoverflow.com/posts/1/vote/2 

비슷한 기술을 구현하기 위해 동일한 사용자가 중복 투표를하지 못하도록 방지하고 스팸을 방지하기 위해 사용할 논리가 무엇인지 궁금합니다.

지금까지 필자는 다음 글 머리 기호를 생각해 냈습니다.

  • 사용자가
  • 에 로그인했는지 확인하십시오. 유효한 게시물 ID와 유효한 투표 유형이 전송됩니다.
  • POST 후 사용자가 이전에
  • 에 투표하지 않았는지 확인합니다. 해시를 생성하는 코드는 사용자 에이전트와 같은 동적 정보를 포함 할 수 없습니다. 다른 브라우저, 다른 OS, 맞습니까?

업데이트 :

"사용자가 로그인 쿠키를 사용하고있는 것 같습니다." - 앤드류

다른 사람이이를 수행하는 방법을 보여줄 수 있습니까? 아니면 다른 말로하면 영숫자 32 비트 문자열 인 fkey가 어떻게 생성되는지 예를 더 구체적으로 보여줄 수 있습니까?

질문 :

      XHR 코드로 실제 사용자 ID를 보내지 않으므로 fkey 대신 fkey을 저장할 수 있도록 테이블 스키마를 업데이트해야합니다. , user_id? fkey는 아마도 각 사용자마다 고유해야 할 것이므로 아마도 투표 테이블에 fkey가있는 행이 있는지 여부를 쿼리 할 수 ​​있습니다.

    비슷한 기술을 구현 한 사람이라면 누구나 유용한 정보를 얻을 수 있습니다.

+1

왜 당신이 당신의 XHR 코드 어디에서나 실제 사용자 ID를 전송하지 않습니다에 엑셀 의견에서 당신을 보호 할 것입니다? –

+0

글쎄, 나는 그것을 사용하지 않는 것으로 나타났습니다, 그리고 아마도 좋은 이유 .. 하나는 사용자 정의 양식을 만들 수있는 값으로 사용자 ID 필드를 넣어, 그리고 그것을 게시하고 그것은 유효한 요청이 될거야? 그러나'fkey'와 같은 것을 사용한다면 아무도 사용자를 기반으로 동일한 해시를 얻기 위해 그것을 역 프로그램 할 수 없으므로 나는이 방법을 사용한다고 생각합니다. –

+3

아마도 로그인 쿠키를 사용하여 사용자를 식별하고 있습니다. 방화범이 끌려서 쿠키를 보냈습니다. – Jess

답변

1

사용자는 valuse를 조작하지 못하도록 URI에 서명 할 수 있습니다. 예를 들어, URI의 일부를 해시로 해시하고 해시를 URI에 추가 할 수 있습니다. 사용자가 URI를 복사하고 값을 변경하면 URI와 서명 된 부분이 유효하지 않게됩니다.

이것은 RESTful API에서 종종 수행되며 현재 접근법은 다음과 유사합니다.

1

나는 사람들이 데이터를 다시 제출하거나 들키지 못하도록하는 것이 얼마나 나쁘냐에 달려 있다고 생각합니다.(예산이 지붕을 통해서가 아닌) 아무것도 100 % 없을 것입니다,하지만 당신은에 의해 다시 제출에서 대부분의 사람들을 유지하는 좋은 일을 할 수 있습니다

  • 자신의 UID 검사 - UID 나 생성 된 ID를 (내가 설명 할 것)
  • 기록 자신의 IP 주소, 혼자 IP 솔루션을 사용

) 생성 된 UID와 함께 (IP와 제출 ID에 대한 DB에 대한 확인 과정의 프록시를 사용하여 패배 할 수있다, 또는 도시의 DSL 이동 통신사와 같이 IP를 자주 변경하는 연결 (그러나 그 다음에는 며칠마다). 개인적으로 UID를 기반으로 고유 한 키를 생성하고 필요에 따라 그 키를 전달합니다. 소금에 절인 MD5 해시는 일반적으로 MD5가 너무 약한 것으로 보이는 경우 AES 구현 또는 정상적으로 작동합니다. 함께하면, 좋은 출발점을 가져야합니다.

+0

이 컨텍스트에서 사용자 ID와 함께 md5와 salt의 예를 포함 할 수 있습니까? –

+0

$ new_uid = MD5 ($ user_name. "이것은 내 소금입니다."); 을 $ new_uid와 함께 사용하면이 값을 각 구성원마다 고유 한 데이터베이스에 저장할 수 있습니다. 물론 나는 각 회원이 이미 ($ user_name에 대한) 기반 이메일 주소와 같은 고유 한 ID를 가지고 있다고 가정하고 있습니다. 그런 다음 자신의 ip - $ ip = $ _SERVER [ 'REMOTE_ADDR']에 대해 쿼리를 수행 할 수 있습니다. 및 소금에 절인 된 MD5 해시로 생성 된 고유 ID 완벽하지는 않지만 근절하기위한 기반. – Liam

2

는 필드에 UNIQUE 인덱스 (thread_id, USER_ID)를 만들고 DBENGINE은 하나 개의 스레드 :

관련 문제