Переменная сеанса завершается ошибкой при генерации с помощью тега IMG

У меня есть капча, которая генерирует изображения костей и переменная сессии. Это происходит случайным образом на живом сервере, но никогда не происходит на блоке разработки. Я не уверен, если это проблема с переменными сеанса или что-то с заголовком (), вызванным ниже. Может быть, какая-то комбинация двух?

В верхней части главной страницы указателя есть session_start();, Страница формы загружается в середине индекса через include ().

В форме капча загружается через эту строку:

<img src="generatedice.php" alt="captcha" height="50px"/>

Сценарий generatedice.php генерирует случайные числа и отображает pngs кости. Затем создает сеанс сессионной переменной.

if (session_status() == PHP_SESSION_NONE) {
session_start();
}
$_SESSION['total']=md5(SECRET+$total);

header('Content-type: image/png');
imagepng($img);
imagedestroy($img);

В POST-файле формы переменная проверяется следующим образом:

if (md5(SECRET+$_REQUEST['answer'])==$_SESSION['total']) {

Когда я повторяю две переменные внутри файла POST, они обычно различаются.

eccbc87e4b5ce2fe28308fd9f2a7baf3 VS a87ff679a2f3e71d9181a67b7542122c

Так как хостинговая компания как-то обрабатывает заголовки сессий? Я немного озадачен и хотел бы знать, что проверить.

Редактировать:
Я думаю, что это может быть проблема загрузки страницы сеанса. Изображение отображается после индексной страницы, если я прав. Таким образом, они заканчивают тем, что были различными сессиями возможно? Как я могу исправить хотя?

Изменить 2:
Это также может быть актуально. Это код в начале основного индекса.

ob_start();
header('Cache-Control: max-age=604800');
session_start();

// Regenerate the Session for Security
if (!isset($_SESSION['regen']))
{
session_regenerate_id();
$_SESSION['regen'] = true;
}

Изменить 3:

Для записи, я полностью удалил этот процесс проверки и заменил его. Но мне все еще интересно, как это можно было исправить.

1

Решение

Я думаю, что реальная проблема заключается в том, что сгенерированное изображение «кэшируется» браузером. Таким образом, он будет повторно использоваться из кэша, а переменная Session НИКОГДА не установлена ​​(или остается в своем первом состоянии), поскольку скрипт никогда не вызывается, даже когда изображение отображается пользователю.

Попробуйте сгенерировать img-тэг, используя PHP, и добавьте случайный параметр, чтобы гарантировать, что клиентский браузер снова вызывает скрипт-файл, и, следовательно, ваша переменная сеанса обновляется при каждом запросе.

echo '<img src="generatedice.php?r='.time().'" alt="captcha" height="50px"/>';

Это позволит избежать того, что браузер кэширует изображение, потому что URL будет отличаться от секунды к секунде.


Если вы включаете изображение на той же странице, на которой пытаетесь обработать ответ, возможно также, что вы действительно обновляете сеанс до НОВОЙ капчи, прежде чем проверять первую.

Попробуйте исключить изображение, если был дан ответ, чтобы увидеть, так ли это:

  if (!isset($_REQUEST["answer"])){
echo '<img src="generatedice.php?r='.time().'" alt="captcha" height="50px"/>';
}else{
if (md5(SECRET+$_REQUEST['answer'])==$_SESSION['total']) {
echo "Your answer was correct";
}else{
echo "Your answer was wrong";
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]