파워 유저가 내 아약스 함수를 호출하지 못하게하려면 어떻게해야합니까?


12

많은 기능을 수행하기 위해 ajax 호출을 사용하는 사이트가 있습니다. 웹 브라우저에서 스크립트 ajax.php를 호출합니다. 게시 데이터를 사용하여 데이터를 전송하고 ajax 스크립트가 호출 할 수있는 명령을 제한하지만 사용자가 사이트를 조작하기 위해 ajax 호출을 스푸핑하는 것을 막을 수있는 것은 없습니다. 사용자가 전화를 스푸핑하는 것을 막는 담요 방법이 있습니까? 실제로 ajax 호출이 다른 스크립트 나 사이트가 아닌 내 웹 사이트에서 오는지 확인하는 방법이 있습니까?

또는 단순히 PHP 스크립트에서 경계 조건을 확인하고 사용자가 허용하지 않는 것을 스푸핑하지 못하게하지만 허용되는 위치를 스푸핑하도록 허용해야합니까?


아약스 호출이 완전히 인증되지 않았습니까? 각각에 대한 세션을 작성합니까? 학대에 대한 패턴이 있습니까? 그리고 문제 특정 조작 또는 사이트에 추가되는 부하량보다 많습니까?
artlung

더 자세한 내용을 게시 할 수 있습니까? AJAX 통화는 무엇을하고 있습니까? 그들은 무엇을 조작하고 있습니까? AJAX 외부에서 스크립트를 호출하면 어떤 문제가 발생합니까?
DisgruntledGoat

나는 실제로 특정 상황에 대해 묻는 것이 아니라 많은 상황에 적용 가능한 일반적인 솔루션을 요구합니다. 그런 해결책이 있다면, 보이지 않는 것 같습니다.
Daniel Bingham

답변:


12

사용자가 얼마나 영리한 지에 따라 전송하는 정보가 스푸핑 될 수 있기 때문에이 작업을 안정적으로 수행 할 수있는 방법이 없다고 생각합니다.

페이지에서 전화하지 않는 단순한 사람들의 블록을 원한다면 참조 페이지를 확인하거나 쿠키를 사용하거나 특정 시간 후에 만료되는 호출 페이지에서 보낸 임의의 숨겨진 필드를 추가하십시오. 그러나 사용자가 실제로 결정되면 스푸핑하기 쉽습니다.


2
+1 .. 사람들이 브라우저에 표시되는 내용의 로컬 사본을 저장하지 못하게하는 것처럼 불가능합니다. 그들이 알아 채기 전에 포기하고 다른 것으로 넘어갈 수 있는지 확인하기위한 대회입니다.
Tim Post

6

요컨대 GET 또는 POST를 통해 URL에 대한 요청은 소프트웨어를 사용하는 모든 사람이 수행 할 수 있습니다. 실제로 AJAX 요청은 URL을 직접로드하는 것과 다르지 않습니다. 후자를 사용하면 반환 된 데이터가 웹 페이지처럼 브라우저에 표시됩니다.

이것이 바로 자바 스크립트 유효성 검증 여부에 관계없이 서버에서 제출 된 데이터의 유효성을 항상 검증해야하는 이유입니다.

서버 측 스크립트가 무엇을하고 있는지, 무엇이 잘못 될 수 있는지는 명확하지 않지만, 사용자가 잘못된 데이터로 스크립트를 호출하여 "사이트를 조작 할 수있는"경우 잘못된 작업입니다.

아마도 가장 좋은 해결책은 어떤 형태의 인증을 도입하는 것입니다.


3

따라서 기본적으로 ajax.php를 AJAX 요청에만 응답하도록 제한하고 싶습니까?

나는 PHP 전문가는 아니지만 주어진 값이 AJAX에서 오는지 또는 값을 확인하여 "일반적인"브라우저 요청에서 오는지 확인할 수있는 것 같습니다 $_SERVER['HTTP_X_REQUESTED_WITH'].

출처


2
가해자가 아약스를 사용하지 않거나 HTTP 헤더를 위조하지 않는다고 가정하는 것이 좋습니다
Adam

1

다른 사람이 지적한 것처럼 ... 아약스 호출은 단지 $ _GET 또는 $ _POST의 수신자 일 뿐이므로 내 접근 방식은 항상 액션 페이지처럼 처리하고 입력을 필터링 / 삭제하는 것입니다. 예를 들어 한 달처럼 예상되는 것과 약간의 차이가 있고 항상 "Jan, Feb, Mar ..."형식 인 경우 예상 값의 배열을 설정하고 이에 대해 필터링 할 수 있습니다. 일치하지 않는 것을 트랩하고 선택적으로 "Bzzt ... 재생 해 주셔서 감사합니다 ..."

내 Ajax 스크립트가 양식 제출보다 안전해야하는 예를 생각할 수 없습니다.

HTH


"Bzzt"+1- "Bzzt-문맥에 따라 훨씬 더 재미있어집니다!" 사용자 컴퓨터에 쿠키가 설정되어 3 시간 동안 금지되는 검은 색으로 천천히 페이드됩니다 (단, 메시지가 표시 될 것입니다)
danlefree

0

귀하의 솔루션의 주요 부분은 특정 사용자 지문의 트래픽을 제한하는 것 입니다. IP 주소의 해시, 사용자 에이전트 문자열 및 전송되는 데이터 일 수 있습니다.

또한 ajax를 호출하는 페이지를 ajax 리턴 데이터에 더 가깝게 바인딩하는 것이 도움이 될 수 있습니다. 따라서 문제가되는 페이지에서 페이지로드시 세션에 적합한 세션 키를 보내십시오. X각 ajax 요청에 대해 JavaScript는 해당 키를 다시 전달해야합니다. 그렇지 않으면 ajax가 실패를 리턴합니다. 페이지가 X+1ajax 호출에 도달하면 새 세션 키를 유선 (원래 ajax의 대역 외)으로 전송하기 전에 사용자가 몇 가지 조치를 취하도록하십시오 (캡처 mousemove또는 tapUA에 따라 이벤트 또는 이벤트 와 같은 이벤트 일 수 있음). 과정.

내가 생각할 때 문제의 일부는 전송 된 매개 변수의 느슨한 유효성 검사 일 수 있습니다. 사람들이 전송 된 매개 변수를 사용하여 유효한 데이터를 다시 얻을 수 있다면 더 어렵게 만듭니다. 이를 수행하는 방법은 클라이언트가 어떤 종류의 값을 보내고 있는지, 나쁜 행위자는 나쁜 값을 보내서 어떤 종류의 장난을 할 수 있는지에 달려 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.