我有一個簡單的控制器功能,刪除一個數據庫條目(它使用模型功能來這樣做)。我在我的一個視圖中有鏈接(例如http://www.example.com/item/delete/3),我使用jQuery顯示確認對話框以確保用戶真的想要刪除它。一切都好。但是,如果您只是在瀏覽器中輸入該網址,該項目將被刪除而不會有任何警告Codeigniter:如何處理與控制器/函數/參數的直接鏈接?
有沒有辦法來處理這種方式我編碼控制器功能或在模型中的方式?
我有一個簡單的控制器功能,刪除一個數據庫條目(它使用模型功能來這樣做)。我在我的一個視圖中有鏈接(例如http://www.example.com/item/delete/3),我使用jQuery顯示確認對話框以確保用戶真的想要刪除它。一切都好。但是,如果您只是在瀏覽器中輸入該網址,該項目將被刪除而不會有任何警告Codeigniter:如何處理與控制器/函數/參數的直接鏈接?
有沒有辦法來處理這種方式我編碼控制器功能或在模型中的方式?
對於刪除操作,我會做一個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意外刪除一個項目。
您可以通過將此行添加到模型和控制器文件的頂部(CI Forum post)來防止此問題。
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class SomeModel extends Model
{
// model code
}
?>
這確保CI已加載。
我已經在我的控制器文件中有;這並不妨礙通過URL訪問該功能。 – rebjr 2010-04-06 21:15:32
我想我想通了,那就是使控制器的功能專用,即
function _delete($id) {
...delete code goes here...
}
如果你這樣做是私密的,人們如何有目的地去實現它?不確定這是最好的方式,但我一直在引導用戶到另一個頁面,他們確認他們想刪除該項目,然後發佈到確認方法。我檢查他們是否已經發布並處理該行爲。 – someoneinomaha 2010-04-06 21:22:34
這是通過一個AJAX請求?如果是這樣,我會發送數據通過POST而不是GET進行刪除,因此無法直接導航。
如果是通過GET,我想象的是確認警告正在拋出的鏈接點擊,而是當你直接轉到頁面時,我會加載它。
你也可以檢查引用者,只有它的工作引用頁面是有效的,但這種方法並不總是100%可靠。
更不用說,如果您使用GET,CSRF攻擊可能更容易。有人可以發佈類似,如果管理員用戶查看它,刪除功能會觸發。 當然,對於一篇文章也可以做同樣的事情,但我會認爲這會更困難。 – someoneinomaha 2010-04-07 01:12:50
完全同意。好點子。 – 2010-04-07 08:09:09