Рейтинг: 2.5548  
На голосовании
Предложил Nikolay Ledenev 14.04.2015 09:37:35

Исправить ошибку передачи куки на все домены через spread.php

Используя стандартные функции Битрикса get_cookie и set_cookie, столкнулся с проблемой, что сохраняется только первое установленное значение (либо первые несколько), а потом перезапись куки умирает.

Проблема оказалась в том, что куки для основного домена .site.ru перезаписывается, а для домена .www.site.ru нет.

Сайт доступен в обоих вариантах, как с www, так и без. Сайтов в Битриксе 1 штука. В этом сайте прописан один домен. Домен прописан как site.ru. В настройках главного модуля стоит галка "Распространять куки на все домены". Ошибка воспроизводится именно в такой конфигурации с заходом на www.site.ru

Оперативный вариант избавиться сейчас от ошибки на ядре 15.0.6 состоит в изменении конфигурации: либо убираем галку "Распространять куки на все домены", либо удаляем все домены в настройках сайта.
Но тут всплывут проблемы в виде уже установленных у пользователей кук на домены, которые могут перетирать устанавливаемые на новой конфигурации куки, и тогда некоторый функционал, связанный с куками, вообще перестает работать для таких пользователей.

Сама суть ошибки в том, что /bitrix/spread.php не выдает в заголовках куку для домена www.site.ru.

Поиск проблемы:
1. md5 в spread.php и передаваемый в параметре $_GET["k"] md5 не совпадают
2. т.к. соль $salt генерируется на стороне php, то проблема не в ней, а в переменной $cookie, которая передается в виде закодированной base64 строки
3. в самом запросе видим что-то типа /bitrix/spread.php?s=QklUU_тут_было_много_букв_BAg%253D%253D&k=af5a0ce9b001a018cb7a98fc26579cec
Интересует нас неправильное окончание параметра s, %253D%253D
4. Поиски доков по функции base64_decode приводят на официальный сайт php: http://php.net/manual/ru/function.base64-encode.php
Где в первом же комментарии видно, что есть вариации в виде base64url_encode для безопасной передачи таких параметров через url.
5. Далее идем патчить ядро:
Ищем функцию GetSpreadCookieUrls() в файле /bitrix/modules/main/classes/general/main.php
и в ней заменяем base64_encode на base64url_encode, предварительно записав функцию base64url_encode в /bitrix/php_interface/init.php
6. В файле /bitrix/modules/main/spread.php прописываем функцию base64url_decode и заменяем вызов base64_decode на base64url_decode
7. Проверяем, теперь проблемы нет и куки устанавливаются нормально!

Прошу поправить ошибку в ближайших апдейтах ядра, т.к. ошибка значительная, и подозреваю что в ядре она очень давно.
Рейтинг: 38.425  
На голосовании
Предложил Постоев Олег 06.09.2013 18:44:00

Валидность кода bitrix и spread.php

В файле "\bitrix\modules\main\classes\general\main.php" выводится картинка:
$res .= '<img src="'.htmlspecialchars($url).'" alt="" style="width:0px; height:0px; position:absolute; left:-1px; top:-1px;" />'."\n";
Проблема в участке "/>".
Для валидатора при HTML 4.01 Strict этот код считается невалидным - нужно убирать слеш.
А вот функция ShowHead() поддерживает параметр вывода этих слешей.

Так может их объединить? И сделать так, что бы при ShowHead(false) эта картинка выводилась без слеша?