2010-04-06 72 views
3

我有一個簡單的控制器功能,刪除一個數據庫條目(它使用模型功能來這樣做)。我在我的一個視圖中有鏈接(例如http://www.example.com/item/delete/3),我使用jQuery顯示確認對話框以確保用戶真的想要刪除它。一切都好。但是,如果您只是在瀏覽器中輸入該網址,該項目將被刪除而不會有任何警告Codeigniter:如何處理與控制器/函數/參數的直接鏈接?

有沒有辦法來處理這種方式我編碼控制器功能或在模型中的方式?

回答

0

對於刪除操作,我會做一個HTTP POST。

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

然後我的JQuery會做一個HTTP POST。

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

這樣客戶端將無法通過瀏覽到他們的Web瀏覽器中的URL意外刪除一個項目。

+0

更不用說,如果您使用GET,CSRF攻擊可能更容易。有人可以發佈類似,如果管理員用戶查看它,刪除功能會觸發。 當然,對於一篇文章也可以做同樣的事情,但我會認爲這會更困難。 – someoneinomaha 2010-04-07 01:12:50

+0

完全同意。好點子。 – 2010-04-07 08:09:09

0

您可以通過將此行添加到模型和控制器文件的頂部(CI Forum post)來防止此問題。

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

這確保CI已加載。

+0

我已經在我的控制器文件中有;這並不妨礙通過URL訪問該功能。 – rebjr 2010-04-06 21:15:32

0

我想我想通了,那就是使控制器的功能專用,即

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

如果你這樣做是私密的,人們如何有目的地去實現它?不確定這是最好的方式,但我一直在引導用戶到另一個頁面,他們確認他們想刪除該項目,然後發佈到確認方法。我檢查他們是否已經發布並處理該行爲。 – someoneinomaha 2010-04-06 21:22:34

0

這是通過一個AJAX請求?如果是這樣,我會發送數據通過POST而不是GET進行刪除,因此無法直接導航。

如果是通過GET,我想象的是確認警告正在拋出的鏈接點擊,而是當你直接轉到頁面時,我會加載它。

你也可以檢查引用者,只有它的工作引用頁面是有效的,但這種方法並不總是100%可靠。