3

我有一个简单的验证码,当 register_global 被禁用时可以完美运行,根据 PHP Manual Using Register Globals这是正确的

但有时我会搬到许多主机上,他们默认启用全局注册,所以我的验证码停止工作,即使输入正确,也总是给出错误的验证码。

我的问题

如果启用了 register_global 以及禁用了,为什么它不起作用?

编码

验证码.php

<?PHP
session_start();
$digits_num=5;
$x_pos=25;
$y_pos=6;
$font_size=5;
function random_num($n){
$start_num = "1".str_repeat("0", $n-1);;
$end_num   = str_repeat("9", $n);
return rand($start_num, $end_num);
}
$text = random_num($digits_num);
$_SESSION["captcha_num"] = md5($text);
$captcha = imagecreatefrompng("./images/captcha.png");
$font_color['black']=imagecolorallocate($captcha, 0, 0, 0);
$font_color['white']=imagecolorallocate($captcha, 80, 73, 20);
imagestring($captcha, $font_size, $x_pos, $y_pos, $text, $font_color['white']);
header("Content-type: image/png");
imagepng($captcha);
?>

表格

<form name="frm" method="post" action="add.php">
<img src="captcha.php">
<input type="text" name="captcha_num" id="captcha_num" >
<input type="submit" name="submit" id="submit" value="submit">
</form>

添加.php

<?PHP
session_start();
if(md5($_POST['captcha_num']) != $_SESSION['captcha_num']){
echo "Wrong captcha";
}else{
echo "Good Pass it";
}
?>
4

1 回答 1

4

从您参考的手册页中:

自 PHP 5.3.0 起,此功能已弃用,自 PHP 5.4.0 起已移除
(...)
也许 PHP 中最具争议的变化是 PHP 指令 register_globals 的默认值在 PHP » 4.2 中从 ON 变为 OFF .0.

换句话说:关掉它

我怎样才能关闭它?

选项 1:使用ini_set

将此代码放在您的代码之上(或在引导文件中,如果有的话)

ini_set('register_globals', 'Off')

选项 2:使用 htaccess

在您网站的根目录中创建一个.htaccess文件并将此代码添加到其中:

php_flag register_globals Off

如果你使用了不好的技术,不要问自己为什么脚本是错误的,问问自己如何关闭/避免使用不好的技术。

于 2012-05-05T21:15:07.893 回答