2011-01-07 4 views
1

사용자가 댓글을 달 수있는 항목이있는 경우 사용자가 답장하는 항목을 전달하는 방법은 무엇입니까?양식 POST 또는 세션?

<form method="post" action="blah"> 
<input type="hidden" name="item_id" value="<?php echo $item_id; ?>"> 
<!-- other form data here --> 
<input type="submit" name="submit"> 
</form> 

또는 단순히 세션 사용 :

$_SESSION['item_id'] = $item_id 

나는 형태로 숨겨진 필드를 사용하지만이 쉽게 불을 지르고 같은 플러그인을 사용하여 변경할 수 있습니다 적이 있지만 양식에 항목 데이터를 보내는 안전한 방법이 있습니까?

편집 :검증 후 ... 나는 (등 형태의 토큰) 일부 XSS 보호 기능을 구현합니까입니다. 내가 묻는 이유는 단지 최선의 관행이 무엇인지 아는 것이 었습니다. ID를 클릭 일치

<input type="hidden" name="item_id" value="<?php echo $id?>"> 

마지막 세션을 확인하십시오 : 그러나

if ($_SESSION('item_id') !== $item_id) //the value posted in the form 
{ 
    die('There\'s got to be a morning after 
     If we can hold on through the night 
     We have a chance to find the sunshine 
     Let\'s keep on looking for the light'); 
} 

나는 다음 양식에

$_SESSION['item_id'] = $id //this is set when they visit the current item 

같은 일을하지만 숨겨진 필드가 일부 의견을 읽은 후에 이것이 나쁜 생각이라고 생각하십니까?

공정하게 (@Surreal Dreams) : 그들이 이드를 변경하면 큰 문제는 아니지만, 내가 말했듯이, 나는 최선의 방법을 찾고있었습니다.

건배.

+1

것이 바람직 할 것 게시물 ID를 스푸핑하는 사용자의 위험은 무엇입니까? –

답변

8

세션 당신이 (1) 방문자가 여러 탭에서 여러 가지 기사를 엽니 경우를 망치는 것 제안 된 방법을 사용하고, (2) 마지막으로 열었던 탭이 아닌 다른 탭에서 답장을 쓰려고합니다.사용자는 서로 다른 탭에 동시에 두 개의 답글을 쓸 수도 있습니다. 때때로 StackOverflow에서 그렇게합니다. 웹 개발자는 오늘날의 방문자가 여러 브라우저 탭을 동시에 열어 놓는 것을 쉽게 잊을 수 있습니다. 실제로 IE6는 더 이상 사용하지 않습니다.

최근에 본 기사 ID의 배열을 $_SESSION['item_id']으로 만들지 만, 일부 방화 친구 사용자 (또는 다른 기술 관련 지식이있는 사람)가 이전에 본 기사에 답장하는 것을 중지 할 수 없습니다. 시간 제한을 추가해도 아무런 변화가 없습니다.

하지만 왜 누군가가 의도적으로 트롤이나 스팸 사이트를 제외하고 답장하는 게시물의 ID를 변경합니까? 누군가가 귀하의 사이트를 망쳐 놓고 싶다면 스팸 코멘트를 게시하기 바로 전에 봇이 해당 페이지를 요청하도록하여 어떤 보호 장치라도 쉽게 활용할 수 있습니다. 더 나은 CSRF 토큰 생성기, 스팸 필터, 속도 제한 기 등에 투자하는 것이 훨씬 낫습니다.

+1

+1 여러 개의 탭을 불러 오려면. 여러 탭을 사용하면 너무 많은 사이트가 실패합니다. – goat

-1

게시 ID를 저장하는 데 $ _SESSION을 사용하면 해당 값을 수정할 수 없으므로 이상적인 솔루션입니다.

그 말은, 누군가 그 일을 할 때 어떤 이점이 있습니까? 또한 많은 댓글 시스템에는 승인 프로세스가있어 관리자가 게시하기 전에 댓글을 승인해야합니다.

그래, 나는 세션 값을 고집하는 것이 좋습니다.

+1

$ _SESSION의 유일한 문제점은 다음과 같습니다. 사용자가 동시에 두 개의 탭을 열면 어떻게됩니까? –

1

솔직히 숨겨진 양식 요소를 사용해도 괜찮을 것입니다. 누군가 당신을 정말로 바꿔 놓는 것에 대해 정말로 염려한다면, 항상 base64()을 인코딩하여 변경할 수 있습니다.

그러나 페이지에 세션 변수를 설정할 수 있으며 양식을 제출하면 해당 값을 다시 호출 할 수 있습니다.

양식

<? 
session_start(); 

//Make a random ID for this form instance 
$form_id = rand(1, 500); 

//Set session variable for this form 
$_SESSION[$form_id]['item_id'] = $item_id; 
?> 

<form method="post" action="process.php?n=<?=$form_id?>"> 
<!-- form data here --> 
<input type="submit" name="submit"> 
</form> 

프로세스

<? 
session_start(); 

//Process only if the number submitted matches the SESSION variable 
if(array_key_exists($_GET['n'], $_SESSION) { 
    //Process tasks 
    echo $_SESSION[$_GET['n']['item_id']; 

    //Unset session variable when done processing 
    unset($_SESSION[$_GET['n']); 
} 
?> 
+0

$ _SESSION의 유일한 문제점은 다음과 같습니다. 사용자가 동시에 두 개의 탭을 열면 어떻게됩니까? –

+0

세션은 서버 수준에서 유지됩니다. 세션 쿠키가 브라우저에 설정되면 세션이 완전히 삭제되거나 브라우저가 완전히 닫힐 때까지 전체 쿠키에 영향을줍니다. 둘 이상의 브라우저 창을 열어도이 양식에서 수행하려는 작업에는 영향을주지 않습니다. –

+0

@mririgo : 맞아. –

1

숨겨진 필드를 사용하십시오.

사용자가 DOM을 수정하여 다른 설명에 대한 회신이라고 말하면 어떻게됩니까? 그것은 단지 그들에게 영향을 미친다.

사용자가 회신 할 수있는 것을 제한하려면 올바른 액세스 제어 계층을 구현하고 사용자 인터페이스에서이를 적용하려고 시도해야합니다.

1

화가 났거나 폭죽을 휘두르는 폭도에서 눈치 챘을 수도 있으므로 여러 탭과 같은 문제로 인해 어느 솔루션도 매우 만족스럽지 않습니다.

사람들이 처음 방문한 다른 객체에 주석을 게시 할 수 있다는 것에 대한 진정한 우려가있는 경우 배열을 사용하여 $ _SESSION에 저장하고 숨겨진 양식을 사용하여 ID를 다시 게시하도록하십시오. 게시 된 값이 배열에없는 경우 분명히 그가보고 있지 않은 게시물입니다.

침입 방지 성을 높이려면 ID를 해시하는 방법 (물론 소금을 많이 쳐서)을 고려하고 배열에 저장하는 것이 좋습니다.

여기에 잘못된 문제를 해결하려고하는 것일 수 있습니다. 그 사람이 자신이 언급 한 게시물에 대한 의견을 말할 수있는 권한이 있는지 확인해보십시오. 액세스 권한이 있다면 코멘트를 허용해야합니다. ID로 변경하고 의견을 잘못된 게시물 아래에 놓으려면 ... 기본적으로 문제가됩니다. 내 말은 사용자가 다른 게시물로 이동하여 수동으로 잘못된 의견을 표명 할 수 있다는 것입니다. 문제는 무엇입니까?

1

당신이이었다이

<? 
$saltedhash = md5("MYSEED"+$item_id;) 
?> 

<form method="post" action="blah"> 
<!-- form data here --> 
<input type="hidden" name="item_id" value="<? echo $item_id ?>"> 
<input type="hidden" name="item_hash" value="<? echo $saltedhash ?>"> 
<input type="submit" name="submit"> 
</form> 

같은 형태를 가질 수있다, 당신은 항상이 ITEM_ID은 해당 해시와 일치 통과하고 사용자가 변경되는지 확인 할 수 있습니다. 다른 사람에 의해 지적 그들이 어딘가에서 해시를 얻을 수있는 것처럼

그러나,이 다른 항목에 게시에서 사용자를 막을 수 없습니다 ... 액세스 제어 메커니즘은 특정 응용 프로그램에 대한

관련 문제