2010-04-06 3 views
3

У меня есть простая функция контроллера, которая удаляет запись БД (для этого используется функция модели). У меня есть ссылка на это в одном из моих представлений (например, 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

Не говоря уже о том, что атаки CSRF, вероятно, проще, если вы используете GET. Кто-то может опубликовать что-то вроде , и если пользователь admin его просмотрит, функция удаления будет срабатывать. Конечно, то же самое можно было бы сделать с поста, но было бы сложнее, я бы подумал. – 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 запрос? Если это так, я бы послал данные для удаления через POST вместо GET, так что он не может быть перемещен напрямую.

Если это происходит через GET, я полагаю, что предупреждение об отказе нажимается на ссылку, я бы вместо этого загрузил ее, когда вы переходите непосредственно на страницу.

Вы также можете проверить реферер и только иметь его работу, ссылаясь на страницу, но этот метод не всегда на 100% надежный.

Смежные вопросы