我正在创建一个带有验证码的表单,我将代码存储在隐藏的输入框中,但是输入框存储了以前的会话代码。我正在猜测它与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);
?>
答案 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);
?>