Zend Framework: DB / Models: защита строк других пользователей - переопределение конкретных методов - PullRequest
2 голосов
/ 24 сентября 2011

Я пытаюсь найти лучший способ защитить данные пользователей.Пример: приложение имеет таблицу «виджеты», каждый пользователь может иметь столько «виджетов», сколько требуется.Приложение идентифицирует «виджеты» по столбцу «userId», который ссылается на идентификатор пользователя, вошедшего в систему.

В настоящее время лучший способ, которым я смог защитить данные виджета от доступа, если переопределитьМетод fetchAll () с моим собственным в моих моделях и добавление WHERE userId = X перед передачей параметров в parent :: fetchAll () примерно так:

class Model_Widgets extends Zend_Db_Table_Abstract {

protected $_name = 'widgets';

/**
 * Abstracted function to ensure data security
 * Adds in a WHERE to the SELECT to check if this user is the datas owner
 * 
 * @see Zend_Db_Table_Abstract::fetchAll()
 */
public function fetchAll($where = null, $order = null, $count = null, $offset = null)
{
    // Handle the additional security check
    $userId = 'userId = ' . Model_Users::getUser()->id;
    // Merge the WHERE userId statement with the rest
    if($where)
    {
        if(is_array($where))
            $where[] = $userId;
        else
            $where = array($where, $userId);
    }
    else
        $where = $userId;

    return parent::fetchAll($where, $order, $count, $offset);
}

Этот метод работает нормально, но я не могу помочьЧтобы думать, что должен быть лучший способ, я недавно обнаружил $ _rowClass, но все еще не уверен, что понимаю концепцию.Если переопределение конкретных функций является единственным способом применить эти проверки безопасности, есть ли способ переопределить их один раз, а не в каждой модели, возможно, с помощью помощника, а затем просто добавить функцию, подобную следующей, к каждой модели, которая должна проверять пользователяпротив строки:

public function fetchAll(...)
{
    return SecurityCheckHelper::fetchAll(...);

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

1 Ответ

0 голосов
/ 24 сентября 2011

В настоящее время лучший способ, которым я смог защитить данные виджета от доступа, если переопределить метод fetchAll () своим собственным в моих моделях и добавить WHERE userId = X перед передачей параметров в parent :: fetchAll ()

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

эти проверки безопасности, есть ли способ переопределить их один раз, а не в каждой модели, возможно, с помощью помощника, а затем просто добавить функцию, подобную следующей, к каждой модели, которая должна проверять пользователя по строке:

Почему бы вам не создать новый абстрактный базовый класс, который реализует эту функцию для всех ваших моделей? Как My_Db_Table_Abstract extends Zend_Db_Table_Abstract.

я пытаюсь сделать так, чтобы пользователи не могли получить доступ к данным других пользователей, играя с идентификаторами в URL и т. Д.

Это работа контроллера!

В моих проектах я решаю эту проблему с помощью ACL и пользовательских утверждений (в моих моделях). Это даже позволяет вам дальнейшие модификации без изменения ваших моделей.

...