2010-03-06 4 views
4

나는 그것이 REST 아키텍처에 반대한다는 것을 알고 있지만 실용적인 관점에서 볼 때 GET 요청 방법을 사용하여 데이터베이스에서 데이터를 제거하는 것에있어 잘못된 점이 무엇입니까?GET을 사용하여 내용을 제거하는 것이 잘못된 이유는 무엇입니까?

관리 패널이있는 응용 프로그램을 만들었습니다. 관리에서 패널 관리자는 다음과 같은 URI를 액세스하여 항목을 제거 할 수 있습니다

/admin-panel/items-controller/remove-action/id/X 

을 X 삭제되는 항목의 기본 키입니다.

이 접근법을 사용하는 데 실제적인 단점이 있습니까? 왜 POST가이 용도로 사용되어야하는지 이해할 수 없기 때문에 교육을 해주십시오.

POST를 사용하여 데이터를 제거하는 주된 문제점은 간단한 링크 (CSS에서 스타일하기 쉬운) 대신 POST 메서드로 각 항목 옆에 양식을 인쇄 한 다음 버튼/링크. 또는 나는 완전히 오해하고 있는가?

+0

URL을 통해 RPC 인터페이스를 노출하는 것으로 보입니다.ReST에서는 작업이 아닌 리소스를 제공합니다. 자원 지향적 인 접근법을 통해 나는 당신의 질문이 스스로 답할 것이라고 생각한다. 'GET/items/id'에서 무엇을 할 것으로 기대하십니까? –

답변

9

세 단어 : 검색 엔진 스파이더.

또는 검색 속도를 높이기 위해 링크를 미리 가져 오는 브라우저 플러그인. 모든 종류의 소프트웨어는 부정적인 영향없이 GET 요청을 자유롭게 만들 수 있다고 암묵적으로 가정합니다. 특히

, 대회는 GET과 HEAD는 방법이 아닌 다른 작업 을 복용의 의미가 안된다고 설립 을하고있다 : 그것은 이렇게 말한다뿐만 아니라 REST는 HTTP 표준 자체 (RFC 2616를)입니다 검색. 이러한 방법은 으로 "안전"해야합니다. 이렇게하면 대리인이 특별한 방법으로 POST, PUT 및 DELETE와 같은 메서드를 나타낼 수 있으므로 은 가능하면 안전하지 않은 작업이 요청된다는 사실을 사용자가 알게합니다.

+0

검색 스파이더가 귀하의 웹 사이트에서 내용을 삭제할 수있는 권한을 가진 경우, GET 요청을 사용하는지 아닌지에 대해 걱정할 필요가 있다고 생각합니다. ;) – Inspire

+2

@Inspire : 인트라넷 용 Google 검색 어플라이언스를 설정하고 자연스럽게 광범위한 액세스 권한을 부여한 사람에게 알리십시오. –

+0

+1 - DailyWTF에서 게시물을 생각 나게합니다 ... –

4

기록이나 북마크를 통해 실현하지 않고 GET 요청을 다시 입력하는 것은 매우 쉽습니다. GET이 파괴적인 경우 의도하지 않은 데이터 손실이 발생할 수 있습니다. 키가 반복되지 않으면 조치가 실패 할 수 있지만 응용 프로그램과 데이터는 위험에 처하게되는 경우 안전 할 수 있습니다. 파괴적인 행동은 항상 POST 나 DELETE 중 하나를 사용하는 것이 좋으며, 보통은 AJAX를 통해 수행되어야하지만, 두 가지를 모두 지원해야하는 경우가 많습니다.

일반적으로 내가하는 일은 버튼으로 폼을 설정하는 것입니다. 그렇지만 버튼을 제거하고 자바 스크립트를 통해 폼 제출을 호출하는 링크 및 클릭 핸들러로 바꿉니다. 삭제는 대개 AJAX를 통해 DELETE 동사를 통해 수행되며 페이지 내용이 콜백에서 업데이트됩니다. 이렇게하면 삭제 동작은 자바 스크립트가 활성화되거나 비활성화 된 브라우저에서 작동하지만 자바 스크립트가 활성화되면 (시간의 95 % 이상) 향상된 기능과 스타일이 적용됩니다.

7

예 : 전체 권한 (삭제 가능)으로 관리자 패널에 로그인되어 있습니다. 제한된 권한을 갖고 있지만 아키텍처에 대한 지식이있는 사용자입니다. 이미지 요청하여 관리자 계정에서 전송되기 때문에 그래서 쉽게 당신에게 내가

<img src="/admin-panel/items-controller/remove-action/id/X" width="1" height="1"> 

당신은 페이지를로드 넣을 수있는 "신뢰할 수있는"페이지에 대한 링크를 제공 할 수 있습니다, 항목이 삭제됩니다.

+0

동일한 토큰으로, 양식을 링크로 위장 할 수 있으며 (어렵지 않음) 나에게도 보내면 결과는 동일 할 것입니다. 또는 더 간단하게, 왜 양식을 위장합니까? 그냥 뭔가 다른 것처럼 보이게하십시오. –

+1

@ 리차드 : 아니오. 링크로 위장한 양식 제출을 통해 * 클릭 *해야합니다. 위 코드를 사용하면 페이지를 보는 것만으로 데이터가 삭제됩니다. –

+0

이 방법으로 CSRF 공격을 막을 수는 없습니다 ( http://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet#Prevention_Measures_That_Do_NOT_Work) –

관련 문제