Jump to content

ipb, создание куков до проверки авторизации

Featured Replies

Posted
comment_82741

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

Не буду описывать всю история, того как я пришел к проблеме. В общем у меня есть код:
 

if($_COOKIE["BITRIX_SM_LOGIN"] != '' and $_COOKIE["pass_hash"] == "") {
   $dbh = mysql_connect("localhost", "***", "***") or die("Не могу соединиться с MySQL.");
   mysql_select_db("***") or die("Не могу подключиться к базе.");
   
   $res = mysql_query("SEL ECT `member_id`, `member_login_key` FR OM `members` WHERE `name` = '{$_COOKIE["BITRIX_SM_LOGIN"]}'");
   $my = mysql_fetch_array($res);
   if($my['member_id'] == ''){
      echo "Такого пользователя нету в базе данных";//Добавить его
   }
   else{
      setcookie( "pass_hash", $my["member_login_key"], time()+3600,"/");
      setcookie( "member_id", $my['member_id'], time()+3600,"/");
      session_name("session_id");
      session_start();
   }
}


 

Вставлял его в шаблон форума с тегами <php></php> куки создавались, пользователь становился авторизованным, но только через раз, или если много раз перегрузить страницу. Понимаю что это MVC, код выполняется в модулях и т.д. Разбираться в этом всем нету желания.


Подскажите пожалуйста, как сделать так, чтобы этот код работал, т.е. чтобы куки создавались до того, как идет проверка авторизации пользователя по кукам?

Edited by Rostislav

comment_82742

возможно заставит чувствовать злость и негодование ко мне
Вовсе нет. На этом форуме, мало кто знает PHP на достаточном уровне.

 

Вставлял его в шаблон форума с тегами куки создавались, пользователь становился авторизованным, но только через раз, или если много раз перегрузить страницу.
Это во всех браузерах так? Или только в определённом?
  • Author
comment_82745

 

Это во всех браузерах так? Или только в определённом?

 

 

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

  • Author
comment_82759

Тему можно закрывать.

Проблема в том, что ipb нужно самому создавать session_id.

 

Дописал:

setcookie( "session_id", "",time() - 3600); //Удаляем session_id в котором еще нету авторизации
setcookie( "pass_hash", $my["member_login_key"], time()+3600,"/");
setcookie( "member_id", $my['member_id'], time()+3600,"/");
header("Location: __forumpervoistok.b.infodesign.ru/"); //Обновляем страницу с моими куки, чтобы ipb создал session_id с авторизацией

comment_82815

Этот код полный п*здец. Кража ключей авторизации, sql инъекция, это только малая часть всех проблем. Автор, если не разбираетесь в безопасности не лезьте в таких вещах как авторизация пользователей. Учите для начала безопасность построения sql запросов.

  • Author
comment_82840

Этот код полный п*здец. Кража ключей авторизации, sql инъекция, это только малая часть всех проблем. Автор, если не разбираетесь в безопасности не лезьте в таких вещах как авторизация пользователей. Учите для начала безопасность построения sql запросов.

 

Хорошо. Просветите пожалуйста, как сделать так, чтобы идея была реализованна безопасным способом?

comment_82875

Для начала вам нужно уяснить одну элементарную вещь - авторизация пользователя нужно проводить на основе достоверных и валидированых данных, и никогда не доверять данным поступающим от пользователя. В куках можно представиться кем угодно, ваша задача состоит в том, чтобы проверить действительно ли данный пользователь является Vasya а не только прикидывается им. Если сессионные данные пользователя в битриксе например хранятся в сессиях PHP, авторизацию (идентификацию) нужно проводить через массив $_SESSION, который пользователь подделать не может. Если сессия хранится в базе данных, как в IPB, на основе идентификатора сессии клиента запросить данные из БД.
Все это, по хорошему, нужно делать хуками, например расширив класс сессий, а не в шаблоне. В IPB есть специальный класс ssoSessionExtension, который вызывается когда создается или обновляется новая сессия.
Не использовать нативные запросы типа mysql_query, и тем более левые подключения через mysql_connect. Для этого есть специальный класс DB доступный через $this->DB.
Не использовать нативные функции и переменные для работы с кукисами. В IPB кукисы могут иметь префиксы. Чтения и запись куков проводится через специальные методы IPSCookie::set, IPSCookie::get.

  • Author
comment_82890

В битриксе сессия существует в куках.

 

В любом случаи нужно передавать в ipb какой пользователь(логин) сейчас авторизовался на сайте, и хочет быть авторизованным на форуме. На сколько я знаю, между поддоменами эта можно сделать только через куки...

comment_82940

В битриксе сессия существует в куках.

У вас искаженное представление о работе сессий в целом. Ни в ИПБ, ни в битриксе, ни где либо еще сессии не хранятся в куках. Сессии хранятся на сервере. У клиента в кукисах находится только уникальный идентификатор по которому сервер определяет какая сессия ему принадлежит. Как правило это уникальный 32 символьный хэш md5.  Разница ипб лишь в том, что сессии он хранит в базе данных, и не использует встроенный механизм php ($_SESSION).

Имея идентификатор сессии, на основе него получаете сессионные данные текущего пользователя. Только по этим данным можно определить кто является текущем пользователем - Vasya Pukin или Guest который только представляется Васей Пукиным. Всем остальным данным поступающем от пользователя доверять не следует, ни логин, ни чему либо еще. В битриксе, на сколько я понял, используются стандартные сессии PHP, которые работают через глобальный массив $_SESSION. Если поддомены разные, кука которая содержит ид сессии сайта (по умолчанию это PHPSESSID) должна быть глобальной, чтобы на домене где установлен ипб php смог получить соответствующую сессию. Нужно либо капать настройки битрикса относительно кукисов, либо установить в нем session_set_cookie_params глобальный домен. 


__dev.1c-bitrix.ru/community/webdev/user/16002/blog/2112/

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.


Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.