2010-04-06 2 views
3

DB 항목을 삭제하는 간단한 컨트롤러 함수가 있습니다 (이렇게하려면 모델 함수를 사용합니다). 내보기 (예 : http://www.example.com/item/delete/3) 중 하나에 대한 링크가 있고 사용자가 정말로 삭제하려는 확인 대화 상자를 표시하기 위해 jQuery를 사용하고 있습니다. 괜찮아. 그러나 브라우저에 해당 URL을 입력하면 경고없이 항목이 삭제됩니다.Codeigniter : 컨트롤러/함수/param에 대한 직접 링크를 처리하는 방법?

컨트롤러 기능을 코딩하는 방식이나 모델에서 처리하는 방법이 있습니까?

답변

0

삭제 작업의 경우 HTTP 게시를 수행합니다.

function delete() 
{ 
    if ($id = $this->input->post('id')) 
    { 
     $this->item_model->delete_item($id); 
    } 
} 

그리고 나서 JQuery가 HTTP 게시를 수행합니다.

$.ajax({ 
    type: 'POST', 
    url: 'item/delete', 
    data: {id:item_id} 
}); 

이렇게하면 클라이언트는 웹 브라우저에서 URL을 탐색하여 실수로 항목을 삭제할 수 없습니다.

+0

GET을 사용하는 경우 CSRF 공격이 더 쉬울 수도 있습니다. 누군가 과 같은 글을 게시 할 수 있으며 관리자가 본 경우 삭제 기능이 실행됩니다. 허락을 받아서도 똑같은 일을 할 수는 있지만 어려울 것입니다. – someoneinomaha

+0

전적으로 동의합니다. 좋은 지적. –

0

이 줄을 모델 및 컨트롤러 파일 (CI Forum post) 맨 위에 추가하면이 문제를 방지 할 수 있습니다.

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 
class SomeModel extends Model 
{ 
// model code 
} 
?> 

이렇게하면 CI가로드됩니다.

+0

이미 컨트롤러 파일에 있습니다. URL을 통해 함수에 액세스하는 것을 막지는 않습니다. – rebjr

0

은 난을 파악 생각하고, 즉

function _delete($id) { 
...delete code goes here... 
} 
+0

그렇게 비공식적으로 만들면 어떻게 사람들이 의도적으로 그것에 도달합니까? 가장 좋은 방법인지 확신 할 수 없지만 사람들을 다른 페이지로 안내하여 항목을 삭제하겠다는 확인을 한 다음 확인 방법에 게시합니다. 그들이 게시 한 경우 조치를 게시하고 처리했는지 확인합니다. – someoneinomaha

0

는 AJAX 요청을 통해이되면, 컨트롤러의 기능을 전용하도록인가? 그렇다면 데이터를 GET 대신 POST를 통해 삭제하여 직접 탐색 할 수 없습니다.

GET을 통해 링크를 클릭 할 때 확인 경고가 표시된다고 상상해보십시오. 직접 페이지로 이동할 때로드가 발생합니다.

리퍼러를 검사하여 참조 페이지가 유효하기 만하면이 방법이 항상 100 % 신뢰할만한 것은 아닙니다.

관련 문제