Почему я получаю эту ошибку PHP session_start ()? - PullRequest
1 голос
/ 23 января 2010

Я не могу понять, почему я получаю эту ошибку сеанса ...

Предупреждение: session_start () [function.session-start]: невозможно отправить ограничитель кэша сессии - заголовки уже отправлено (вывод начался в C: \ вебсервер \ HTDOCS \ project2 \ лаборатории \ форм-вносит представление \ index.php: 2) в C: \ вебсервер \ HTDOCS \ project2 \ лаборатории \ форм-вносит представление \ index.php по линии 2

Насколько я знал, это происходит только тогда, когда перед вызовом функции session_start () происходит какой-то вывод в браузер, в этом случае перед вызовом ничего не выводится на экран, даже пробелы. Есть идеи, почему я все равно получу ошибки?

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

<?php
session_start();

require('formkey.class.php');
$formKey = new formKey();

$error = 'No error';

//Is request?
if($_SERVER['REQUEST_METHOD'] == 'post')
{
    //Validate the form key
    if(!isset($_POST['form_key']) || !$formKey->validate())
    {
        //Form key is invalid, show an error
        $error = 'Form key error!';
    }
    else
    {
        //Do the rest of your validation here
        $error = 'No form key error!';
    }
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    <title>Securing forms with form keys</title>
</head>
<body>
    <div><?php if($error) { echo($error); } ?>
    <form action="" method="post">
    <dl>
        <?php $formKey->outputKey(); ?>

        <dt><label for="username">Username:</label></dt>
        <dd><input type="text" name="username" id="username" /></dd>
        <dt><label for="username">Password:</label></dt>
        <dd><input type="password" name="password" id="password" /></dd>
        <dt></dt>
        <dd><input type="submit" value="Submit" /></dd>
    <dl>
    </form>
</body>
</html>

файл класса

<?php
class formKey
{
    //Here we store the generated form key
    private $formKey;

    //Here we store the old form key 
    private $old_formKey;

    //The constructor stores the form key (if one excists) in our class variable
    function __construct()
    {
        //We need the previous key so we store it
        if(isset($_SESSION['form_key']))
        {
            $this->old_formKey = $_SESSION['form_key'];
        }
    }

    //Function to generate the form key
    private function generateKey()
    {
        $ip = $_SERVER['REMOTE_ADDR'];
        $uniqid = uniqid(mt_rand(), true);
        return md5($ip . $uniqid);
    }

    //Function to output the form key
    public function outputKey()
    {
        //Generate the key and store it inside the class
        $this->formKey = $this->generateKey();
        //Store the form key in the session
        $_SESSION['form_key'] = $this->formKey;

        //Output the form key
        echo "<input type='hidden' name='form_key' id='form_key' value='".$this->formKey."' />";
    }


    //Function that validated the form key POST data
    public function validate()
    {
        //We use the old formKey and not the new generated version
        if($_POST['form_key'] == $this->old_formKey)
        {
            //The key is valid, return true.
            return true;
        }
        else
        {
            //The key is invalid, return false.
            return false;
        }
    }
}
?>

Ответы [ 2 ]

1 голос
/ 23 января 2010

Я столкнулся с этой ошибкой один раз, когда в начале файла была спецификация (маркер порядка байтов). Очевидно, это также вызвало отправку заголовков. Тем не менее, это может быть ошибка php, которая была исправлена. Стоит взглянуть хотя ..

РЕДАКТИРОВАТЬ: На данный момент, я думаю, что session_start () выдает ошибку, прежде чем он может получить куки. Ранняя ошибка будет отправлена ​​в браузер и предотвратит отправку куки. Однако в этом случае вы должны увидеть более раннюю ошибку на вашем экране. Я знаю, что это, вероятно, не проблема, но я не могу думать о том, что еще может быть причиной проблемы.

0 голосов
/ 23 января 2010

у вас, вероятно, есть пробелы в верхней части index.php .. прямо перед <? tag, может быть пробелом ... который вызвал бы это .. php очень привередлив в этом ... session_start должен быть вызван до того, как будет выдан какой-либо вывод ... </p>

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