Session echo的上一个变量

时间:2013-12-18 20:39:27

标签: php

我正在创建一个带有验证码的表单,我将代码存储在隐藏的输入框中,但是输入框存储了以前的会话代码。我正在猜测它与session_stars有什么关系,我已经摆弄它,但无可救药!

请有人指出我正确的方向!

PHP文件:

<body>
    <?php
    session_start();
    ?>
    ...
    <div id="reg-field">
        <h1>Human Verification</h1>
        <div id="captions">
            <img src="PHP/captcha.php" style="float: right;" class="cnr-all" /> 
        </div>
        <form name="Form3" method="post">
            <input type="text" id="captcha-bar" class="cnr-all" name="answer" placeholder="Enter Code Here" />
            <input type="hidden" name="answer2" value="<?php echo $_SESSION['captcha']; ?>"/>
            <input type="button" id="captcha-reload" class="cnr-all" onclick="window.location.href = window.location.href">
            <span id="captchaConfirm" class="confirmMessage" style="margin: 12.5px 0px"></span>             
        </form>
    </div>      
    ...
    </body>

Captcha PHP Creator:

<?php
session_start();

header("Expires: Tue, 01 Jan 2013 00:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';

for ($i = 0; $i < 5; $i++) 
{
    $randomString .= $chars[rand(0, strlen($chars)-1)];
}

$_SESSION['captcha'] = strtolower( $randomString );


$im = @imagecreatefrompng("captcha_bg.png"); 


imagettftext($im, 30, 0, 10, 38, imagecolorallocate ($im, 0, 0, 0), 'larabiefont.ttf', $randomString);

header ('Content-type: image/png');
imagepng($im, NULL, 0);
imagedestroy($im);

?>

2 个答案:

答案 0 :(得分:1)

session_start()必须在任何输出之前。把它作为第一行代码是最安全的。您之前有<body>标记,因此会失败。

答案 1 :(得分:1)

在将任何HTML发送到客户端之前,将执行第一个文件的PHP。

含义:在客户端请求captcha.php生成新的验证码之前,将输出SESSION中的代码。

您可以通过在第一个文件中生成验证码来解决此问题。 或者甚至更好,不要将它打印出HTML(隐藏输入是一个安全问题),只是将用户的答案与你$ _SESSION中的任何内容进行比较。 这样你就可以刷新验证码,直到用户提交它的代码。然后将POST ['captcha']与SESSION ['captcha']

进行比较

另外:http://www.w3.org/TR/turingtest/

文件1:

<?php
    session_start();
    $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';

    for ($i = 0; $i < 5; ++$i) 
    {
        $randomString .= $chars[rand(0, strlen($chars)-1)];
    }

    $_SESSION['captcha'] = strtolower( $randomString );
?>
<body>
...
<div id="reg-field">
    <h1>Human Verification</h1>
    <div id="captions">
        <img src="PHP/captcha.php" style="float: right;" class="cnr-all" /> 
    </div>
    <form name="Form3" method="post">
        <input type="text" id="captcha-bar" class="cnr-all" name="answer" placeholder="Enter Code Here" />
        <input type="hidden" name="answer2" value="<?php echo $_SESSION['captcha']; ?>"/>
        <input type="button" id="captcha-reload" class="cnr-all" onclick="window.location.href = window.location.href">
        <span id="captchaConfirm" class="confirmMessage" style="margin: 12.5px 0px"></span>             
    </form>
</div>      
...
</body>

文件2:

<?php
session_start();

header("Expires: Tue, 01 Jan 2013 00:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

$im = @imagecreatefrompng("captcha_bg.png"); 


imagettftext($im, 30, 0, 10, 38, imagecolorallocate ($im, 0, 0, 0), 'larabiefont.ttf', $_SESSION['captcha']);

header ('Content-type: image/png');
imagepng($im, NULL, 0);
imagedestroy($im);

?>