Однажды, при переносе сайта с одного хостинга на другой, столкнулся с неожиданной проблемой – перестала работать капча. Т.е. при вводе корректного проверочного кода сайт мне сообщал, что код некорректный и предлагал ввести его снова. Стал разбираться.
В логах нашел что-то типа:
PHP Notice: Undefined index: PHPSESSID in /.../public_html/index.php on line 12
Я не специалист в PHP, но понял, что дело в сессиях. Упрощенно, капча у меня на сайте работает примерно так:
- Каждому посетителю сайта присваивается уникальный номер – назовем его PHPSESSID.
- Пользователь заходит на страничку, где используется капча. Сервер считывает его PHPSESSID, генерирует проверочный код для капчи и «привязывает» этот код к PHPSESSID.
- Пользователь заполняет форму, вводит проверочный код и отправляет форму.
- Сервер опять смотрит, какой у пользователя PHPSESSID, находит соответствующий этому PHPSESSID проверочный код и смотрит, совпадает ли он с кодом, который ввел пользователь. Если да – все ОК, если нет – ошибка.
После переезда оказалось, что переменная PHPSESSID, в которой должен содержаться уникальный код посетителя, пуста. Поэтому когда пользователь заходит на страничку, где используется капча, сервер генерирует проверочный код, но НЕ ПРИВЯЗЫВАЕТ его к PHPSESSID, т.к. у пользователя его нет. В итоге пользователь проверочный код видит, вводит – и всегда получает ошибку, т.к. сервер не знает, с чем сравнивать код, введенный пользователем.
Причина такого поведения оказалась проста. Сессионные переменные хранятся в глобальном массиве $_REQUEST. В новых версиях PHP (от 5.3 и выше), в целях безопасности, по умолчанию информацию о сессиях разрешено передавать с помощью $_GET и $_POST, и запрещено с помощью $_COOKIE. Т.е. по умолчанию в фале php.ini присутствовала такая запись:
request_order = "GP" (т.е. Get и POST)
А у меня на сайте для передачи сессионной информации как раз куки и использовались! Решить проблему можно двумя путями: если есть доступ к php.ini, то надо заменить строку на:
request_order = "GPC"
Если доступа к php.ini нет – можно в файле htaccess прописать дерективу:
php_value request_order GPC
Комментариев: 1 RSS
1 Айра 20-06-2016 00:45
Благодарю вас! Тоже столкнулась с этой проблемой, и благодаря вашей статье быстро решила ее.