2012-01-10 1 views
4

사용자가 게시물, 사이트의 사용자 ID (세션에 저장되어있는) 및 게시물을 클릭하면 좋아요/다른 시스템을 만들려고합니다. id는 ajax 호출을 통해 데이터베이스에 저장됩니다.하우투는 PHP와 같은/다른 시스템에 스푸핑 된 게시를 방지합니다.

그런 다음 일부 사용자가 다른 도메인에있는 보이지 않는 입력 필드 (자신의 글 머리 기호 중 하나가 있음)가있는 HTML 양식을 만들고 나중에 나를 기억하거나 내 사이트를보고있는 사용자에게 링크를 제공하면 어떨까요?

사용자가 버튼을 클릭하면 양식이 게시물 ID를 내 사이트에, 세션에 사용자 ID가 포함되며 이러한 ID는 데이터베이스에 저장됩니다.

좋은 해결책이 내 마음에 오지 않습니다. HTTP 리퍼러보다 더 신뢰할 수있는 방법이 있나요? 당신은 말을 사전

+3

[CSRF 공격] (http://en.wikipedia.org/wiki/Cross-site_request_forgery) – pleasedontbelong

+0

정확히 무엇을 방지 할 수 있습니까? – TJHeuvel

답변

5

한 가지 방법은 사용자 세션에 특정한 HTML에 비밀 변수를 삽입하는 것입니다. 이것은 cross site 위조를 방지 할 수 있습니다. 당신이 임의의 '키'를 생성하고 세션에 저장할 것 PHP에서

:

<input type="hidden" name="chkVar" value="<?=$_SESSION['myFormVar']?>"/> 

: 형태 그리고

$_SESSION['myFormVar'] = md5(mt_rand()); 

, 당신은 숨겨진 변수로 추가 할 것 POST를 통해 그리고 HTTPS를 통해 양식을 제출해야 chkVar의 값을 가로 채기가 더 어려워집니다 (불가능하지는 않음).

게시 된 양식을 처리하는 코드에서 게시 된 chkVar을 세션 변수와 비교하십시오. 이상적인 세계에서는 요청마다 고유 한 chkVar를 사용하지만, 전체 세션에 대해 동일한 세션을 사용하면 대부분의 csrf 공격을 막을 수 있습니다.

+1

같은 페이지 (또는 여러 개의 AJAX 요청)에 여러 개의 양식이있는 경우이 양식에 단일 토큰을 사용하면 편리합니다. 그렇지 않으면 문서 (또는 쿠키)에서 각 항목을 가져 와서 적절한 요청에 사용하는 것이 쉽지 않습니다. 나는 그것을하는 것에 잘못된 것을 보지 못한다. 그러나 더 편집증적인 사람들의 일부는 그것을 피한다. –

+1

관련 내용 : [CSRF 보호 : 모든 양식에 대해 토큰을 생성해야합니까?] (0120-337-3311) – Gumbo

+1

동의하면 폼마다 하나씩 저장하는 것이 정말 고통 스러울 수 있습니다. Csrf를 막기 위해 제한된 기간 동안 같은 것을 사용하는 것이 좋다고 느낍니다. 그러나 요청/응답을 차단하는 해커를 찾고 있다면 어쨌든 도움이되지 않을 것입니다. –

2

에서

덕분에 대해 CSRF 이용한다.
좋은 보안 질문입니다.
일반적으로 서버에서만 알려진 키로 일반적으로 관리됩니다.
이 키는 모든 양식에서 사용해야합니다.
보호 할 내용은 little tutorial입니다.

+0

설명과 튜토리얼 링크에 감사드립니다! – Drust

1

당신이 보내는 유일한 것은 게시 ID입니다. 사용자 ID는 AJAX를 통해 호출하는 스크립트에서 자동으로 선택해야합니다. 사용자가 로그인했음을 확인했다고 가정하면 더 이상의 보안 위험없이 두 가지 정보를 모두 얻을 수 있습니다.

+1

이 완전히 사실이 아니라면 동일한 요청을 생성하고 대상 도메인에서 기존 세션을 활용하는 다른 사이트의 양식을 고려할 수 있습니다. –

+0

'AJAX를 통해 호출하는 스크립트에서 사용자 ID를 자동으로 가져와야합니다. 제 질문에 말한대로 정확하게 말했던 일을하고 있지만 CSRF 공격에 취약합니다! 나는 폴과 완전히 동의한다! – Drust