2012-06-20 2 views
0

У меня это в моем контроллере.CakePHP: Правильный способ безопасного удаления записи

public function delete($id) { 
    if($this->request->is('get')) { 
     throw new MethodNotAllowedException(); 
    } 

    $this->Memberlist->id = $id; 
    if (!$this->Memberlist->exists()) { 
     throw new NotFoundException(__('Invalid list.')); 
    } 
    if ($this->Memberlist->delete()) { 
     $this->Session->setFlash(__('List deleted.'), 'success'); 
     return $this->redirect(array('action'=>'index')); 
    } 
    $this->Session->setFlash(__('List was not deleted.'), 'error'); 
    return $this->redirect(array('action'=>'index')); 
} 

Моя модель выглядит следующим образом: (belongsTo)

<?php 

class Memberlist extends AppModel { 
    public $name = 'Memberlist'; 
    public $belongsTo = array(
      'Account' => array(
      'className' => 'Account', 
      'foreignKey' => 'account_id' 
     ) 
    ); 

В одном из моих взглядов, у меня есть что-то вроде этого:

echo $this->Form->postLink('Delete', 
        array('action' => 'delete', $list['Memberlist']['id']), 
        array('class'=>'btn-mini btn', 'confirm' => 'Are you sure?')); 

который создает HTML как это:

<form id="post_4fe15efc0d284" method="post" style="display:none;" name="post_4fe15efc0d284" action="/Grid/memberlists/delete/9"> 
<input type="hidden" value="POST" name="_method"> 
<input id="Token1627936788" type="hidden" value="8756f7ad21f3ab93dd6fb9a4861e3aed4496f3f9" name="data[_Token][key]"> 
<div style="display:none;"> 
</form> 
<a class="btn-mini btn" onclick="if (confirm('Are you sure?')) { document.post_4fe15efc0d284.submit(); } event.returnValue = false; return false;" href="#">Delete</a> 

Проблема в том, что когда я обновляю ID, найденный в action="/Grid/memberlists/delete/9" с использованием Firebug (или любого инструмента для разработчиков), я могу в значительной степени удалить что угодно! Даже из другого аккаунта. Хотя у меня включен компонент безопасности.

Что было бы правильным способом сделать это? Я думаю о проверке account_id против account_id текущего пользователя. Но мне просто интересно, есть ли у CakePHP что-то готовое, которое исправляет эту проблему?

ответ

3

Вы можете добавить обратную ссылку beforeDelete в свою модель и запросить базу данных и проверить, разрешено ли пользователю удалять запись и является ли он владельцем.

+0

Я новичок в CakePHP и нашел этот ответ очень прост в реализации. Это также имело большой смысл для этого в модели. – wenbert

2

Чтобы действительно прекратить пользователям выполнять различные действия, такие как удаление вещей, которые не принадлежат пользователю, вы должны использовать Auth Component.

Я предполагаю, что модель учетной записи хранит пользовательские данные. Вам нужно будет следовать учебному курсу в кулинарной книге, но я подчеркнул, как будет отклонено разрешение на удаление.

Ваш isAuthorized метод будет выглядеть примерно так:

public function isAuthorized($account) { 
    // The owner of a post can edit and delete it 
    if (in_array($this->action, array('edit', 'delete'))) { 
     $memberListId = $this->request->params['pass'][0]; 
     if ($this->MemberList->isOwnedBy($memberListId, $account['id'])) { 
      return true; 
     } 
    } 

    // Default deny 
    return false; 
} 

И это пойти бы в модели:

public function isOwnedBy($memberList, $account) { 
    return $this->field('id', array('id' => $memberList, 'account_id' => $account)) === $post; 
} 
Смежные вопросы