2011-09-07 1 views
1

투표 스크립트가 있습니다. 잘 작동한다.사이트에 직접 연결되지 않았는지 어떻게 확인할 수 있습니까?

하지만 약간 문제가 있습니다. 저는 사람들이 투표 제출 페이지 (투표가 DB에 제출 된 페이지)에 직접 도달하기를 원하지 않습니다. 특정 링크를 통해서만 연락하기를 바랍니다.

내 투표 링크 :

<form> 
<INPUT id="voteup1" type="BUTTON" VALUE="Vote it up!" ONCLICK="window.location.href='rankup.php?rankid=<? echo $id1; ?>'"> 
<INPUT id="votedown1" type="BUTTON" VALUE="Vote it down!" ONCLICK="window.location.href='rank.php?rankid=<? echo $id1; ?>'"> 
</form> 

$id1은 사용자에 의해 선정 된 페이지를 정의하는 것입니다. (투표가 데이터베이스에 추가 될 때 중요합니다.)

저는 사람들이 rankup.php와 rank.php에 직접 도달하기를 원하지 않습니다. 어떻게 내가 이것을 막을 수 있니?

+2

URL 행 (GET 요청) 또는 요청 헤더 (POST 요청)에서 * id = 1 *로 브라우저에서 rank.php를 호출하면 항상 upvote가 트리거됩니다. 그것이 HTTP가 작동하는 방식이며, 그것이 의미있는 것입니다. Referer HTTP 헤더로 게임을 시도 할 수는 있지만, 종종 충분한 사람들이 HTTP 헤더를 사용 불가능하게 만듭니다. 그냥 그대로 두십시오. –

답변

1

PHP의 리퍼러 변수 $_SERVER['HTTP_REFERER']을 사용하여 참조 URL이 자신에게 속한 것인지 확인할 수 있습니다. 그러나이 정보가 전송되지 않을 수 있기 때문에이 100 %에 의존 할 수 없으며 HTTP 헤더의 일부이므로 사용자가 원할 경우 수정할 수 있습니다.

세션은 제안 된대로이 작업을 수행하는 좋은 방법 일 수 있습니다. 사용자가 귀하의 사이트에서 쿠키를 비활성화 할 수 있기 때문에 쿠키를 통한 세션을 선택하고 쿠키는 사용자가 편집 할 수 있습니다. 세션은 서버에 대한 액세스 권한이있는 사용자 (일반적으로 공유 호스팅) 만 편집 할 수 있습니다.

나는 또한 당신이이 일을하는 방식에 동의하지 않습니다. 현재 사용자가 브라우저에서 JavaScript를 사용하도록 설정 한 상태입니다. 일부 사용자는 사용하도록 설정하지 않았으며 일부 사용자의 브라우저는 지원하지 않습니다. 일부 사용자는 그런 페이지 리디렉션을 사용 중지하기까지합니다. 당신이 다음을 누르면 그에 따라 함수를 실행 한 두 개의 버튼 중 어느 감지 rank.php에서

<form action="rank.php" method="post"> 
<input type="submit" value="Vote up!" /> 
<input type="submit" value="Vote down!" /> 
</form> 

:

개인적으로, 오히려 두 개의 스크립트를 사용하는 것보다, 내가 좋아하는 하나의 스크립트 뭔가를 사용하십시오. 세션 변수를 사용하여 투표 할 항목의 ID를 저장 한 다음 세션에서 해당 ID를 읽을 수 있습니다 (마지막으로 사용자가 ID를 변경할 수 없도록 이스케이프 처리하십시오). 분.

바라건대 아이디어가 필요합니다.

+0

어, "쿠키를 통한 세션 선택"- 세션을 일반적으로 * 쿠키를 사용하여 구현합니까? 따라서 99.9 %의 쿠키가 세션을 의미하지 않습니다. – Piskvor

+0

쿠키를 사용할 수없는 경우 세션은 URL이 올바르게 설정되어 있어야 제공됩니다. –

+0

이것이 더 이상 기본적으로 활성화되어 있지 않다는 느낌이 들었습니다. (2005 년 언젠가 그것을 사용하고 있었을 때부터)'trans-sid' 기능은 POST-ed 형식을 지원하는 데 문제가있었습니다. – Piskvor

2

가장 좋은 방법은 쿠키를 사용하는 것입니다. 특정 기간 내에 생성 한 쿠키 값만 투표에 사용하도록 허용하십시오. 그렇지 않으면 쿠키 값을 생성하기가 쉽습니다.

PHP 세션에서 쉽게 할 수 있습니다.

GET 요청에 대한 조치 (투표 수 변경)가 발생하는 것은 권장되지 않습니다. GET 변수는 특정 매개 변수가있는 데이터를 검색 할 때만 사용해야합니다. 대신 POST을 사용하십시오. 그렇지 않으면 투표가 진행되는 동안 검색 봇이 넘어 질 때마다 투표가 변경됩니다.

3

HTTP는 상태 비 저장입니다. 이며 페이지에 "직접/간접"도달하지 않습니다. 각 요청은 이전 요청과 연결이 끊어집니다.

PHP는이 제한을 극복 할 수있는 메커니즘을 가지고 있습니다 : Sessions은 차례로 쿠키를 사용합니다.

따라서 세션 변수를 설정하여 투표 버튼이있는 페이지에서 "can-vote-now"플래그를 설정하고 투표가 설정되지 않은 경우 투표를 금지 할 수 있습니다. 페이지에

의사 코드 버튼/w :

set_voting_variable_for($poll_identifier); 

rankup.php에 대한 의사 코드 :

if (!is_voting_variable_set($poll_identifier)) { 
    // redirect away 
} else { 
    // register the vote 
} 

아, 그리고주의 일이을 일어날 수 있도록 페이지 ("비 소위 있음 -idempotent "행동 (예 : 투표 수 증가)은 GET을 통해 접근 할 수 없습니다 (GET은 -"멱등 원 "액션을 변경하지 않고도 이 보이는대로 예약 됨) : 대신 POST을 사용하는 양식을 만드십시오.

관련 문제