CakePHP пользовательские подделки сессий - PullRequest
1 голос
/ 11 января 2012

Я испытываю странное поведение в своем приложении cakePHP.У меня есть следующее в какой-то системе голосования:

$user_id = ($this->Session->check('User')) ? $this->Session->read('User.id') : 0;
$data = array(
    'id' => NULL,
    'user_id' => $user_id,
    'object_id' => $this->params['form']['object_id'],
    'datetime' => date('Y-m-d H:i:s')
);

$this->Votes->create();
$this->Votes->save($data);

Как вы можете видеть, если $_SESSION['User'] не установлено, user_id будет равно нулю (0).В противном случае это будет идентификатор пользователя.Сеанс пользователя создается, когда пользователь входит в систему.

Это позволяет незарегистрированным пользователям также голосовать, что нормально.

Проблема в ... Каким-то образомгруппа голосов с user_id != 0 (т.е. предположительно существующими и зарегистрированными участниками) была сохранена.Когда я проверил идентификаторы пользователей, их нет в таблице пользователей.

Это похоже на то, как кто-то отправил голоса со случайными идентификаторами пользователя.Идентификаторы, которые даже не существуют!

Важно отметить, что:

  • идентификатор пользователя не приходит ни от какого пользовательского ввода.Это читается из сеанса;
  • нет связи между голосами и пользователями.Таблицы находятся в двух разных базах данных, и для этой цели им не нужно никаких отношений

Кто-нибудь знает, если я что-то здесь упускаю?Я предполагаю, что вещи не так?Как кто-то может подделать идентификатор пользователя, в этом случае идентификатор, который не существует?

Ответы [ 2 ]

0 голосов
/ 15 января 2012

Проблема решена. Это была ошибка в процессе регистрации. Был шаг, на котором новые пользователи могли вернуться, чтобы изменить / добавить информацию, прежде чем нажать «ОК».

По ошибке был установлен сеанс с будущим (но еще не созданным) идентификатором пользователя. На этом этапе, если этот пользователь попытается проголосовать, у него будет действительный сеанс, но пользователя, которого не существует.

0 голосов
/ 12 января 2012

(Основано на CakePHP 2.0.5, но должно применяться и к Cake 1.3.x)

Прежде всего, как настроить сеанс пользователя? Что вы подразумеваете под User session is created when the user logs in?

Если вы копаете User.id, установленный AuthComponent, это на самом деле Auth.User и Auth.User.id. Вы можете сделать debug($this->Session->read()), чтобы проверить, правильно ли вы извлекаете значение из Session.

Обычно в своем приложении я использую AuthComponent, чтобы получить зарегистрированный user.id. Это очень надежно, так как это устанавливается Cake автоматически, если вы используете их встроенный метод AuthComponent::login, и Cake сбрасывает их после истечения сеанса пользователя (или выхода из системы), и, таким образом, вы можете положиться на него, чтобы проверить, если пользователь вошел или нет.

Я бы предложил следующее:

$user_id = $this->Auth->user('id');
$data = array(
    'id' => NULL,
    'user_id' => $user_id,
    'object_id' => $this->params['form']['object_id'],
    'datetime' => date('Y-m-d H:i:s', time())
);

$this->Votes->create();
$this->Votes->save($data);

И ваш $user_id будет либо цифрой, либо NULL, если нет действительного сеанса пользователя.

Подробнее:

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...