PHP Captcha 在服务器上不起作用,但在本地工作

Posted

技术标签:

【中文标题】PHP Captcha 在服务器上不起作用,但在本地工作【英文标题】:PHP Captcha doesn't work on server but work localy 【发布时间】:2019-02-09 18:01:17 【问题描述】:

我的 php 验证码在我的 OVH 服务器上不起作用。

使用 wamp 在 localhost 上一切正常。 取消上传后,验证码根本不会显示在我的网站上。

我不知道我做错了什么。

我的 captcha.php 包含在我的表单中,例如:<img src="captcha.php" alt="CAPTCHA" class="captcha-image">

PS : php-gd 已经安装并且是最新的。 PHP版本:7.0.33

验证码.php:

session_start();

$permitted_chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ';

function generate_string($input, $strength = 10) 
    $input_length = strlen($input);
    $random_string = '';
    for($i = 0; $i < $strength; $i++) 
        $random_character = $input[mt_rand(0, $input_length - 1)];
        $random_string .= $random_character;
    

    return $random_string;


$image = imagecreatetruecolor(200, 50);

    imageantialias($image, true);

$colors = [];

$red = rand(125, 175);
$green = rand(125, 175);
$blue = rand(125, 175);

for($i = 0; $i < 5; $i++) 
$colors[] = imagecolorallocate($image, $red - 20*$i, $green - 20*$i, $blue - 20*$i);


imagefill($image, 0, 0, $colors[0]);

for($i = 0; $i < 10; $i++) 
    imagesetthickness($image, rand(2, 10));
    $line_color = $colors[rand(1, 4)];
    imagerectangle($image, rand(-10, 190), rand(-10, 10), rand(-10, 190), rand(40, 60), $line_color);


$black = imagecolorallocate($image, 0, 0, 0);
$white = imagecolorallocate($image, 255, 255, 255);
$textcolors = [$black, $white];

$fonts = [dirname(__FILE__).'\fonts\Acme.ttf', dirname(__FILE__).'\fonts\Ubuntu.ttf', dirname(__FILE__).'\fonts\Merriweather.ttf', dirname(__FILE__).'\fonts\PlayfairDisplay.ttf'];

    $string_length = 6;
$captcha_string = generate_string($permitted_chars, $string_length);

$_SESSION['captcha_text'] = $captcha_string;

    for($i = 0; $i < $string_length; $i++) 
    $letter_space = 170/$string_length;
        $initial = 15;

    imagettftext($image, 24, rand(-15, 15), $initial + $i*$letter_space, rand(25, 45), $textcolors[rand(0, 1)], $fonts[array_rand($fonts)], $captcha_string[$i]);


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

本地:https://i.imgur.com/rqTK2X3.png 远程:https://i.imgur.com/Z4lEa9r.png

【问题讨论】:

您能否在(损坏的)验证码图像上右键单击,将image link address 复制并粘贴到此处(本地和远程) 这里可能的情况是页面可能会在图像之前生成 php 警告/通知 - 因此浏览器正在获取损坏的图像。我倾向于在最后两行注释掉的情况下运行页面,并检查是否正在生成任何 php 警告,并添加 echo 'test';确保您到达文件的末尾 - 看看是否显示任何内容 @saibbyweb : localhost/captcha.php?1549736811543 远程 : example.com/captcha.php?1549733788640 @MantisSupport :与行评论相同的结果,我得到了回声测试 【参考方案1】:

我认为您的 OVH 服务器上缺少 GD 扩展。检查日志以确认。您的服务器向浏览器发送错误,但由于浏览器需要图像,因此它会显示丢失/损坏的图像图标。

您可以使用以下命令之一安装 GD(取决于您的 PHP 版本)

sudo apt-get install php7.0-gd
# or
sudo apt-get install php7.1-gd
# or
sudo apt-get install php7.2-gd

查看install php70-gd on ubuntu了解更多安装GD的详细信息

【讨论】:

正如我所说:“PS:php-gd 已经安装并且是最新的。PHP 版本:7.0.33”。所以,命令返回我“php7.0-gd 已经是最新版本(7.0.33-0+deb9u1)”。但我现在会尝试安装 PHP 7.2 @shaax 你在你的 fpm/apache 中启用了它吗?你能显示 phpinfo() 转储吗?是否有任何警告/错误?当您尝试打开验证码图像时,实际输出是什么? 好吧,我只是在更新 php 7.2 做一些废话。我重新安装了一个新的 Debian 9,安装了 PHP 模块,并很快给你发了一个 phpinfo() 转储。谢谢你帮助我 好的,它可以工作了......几乎。现在,我只看到验证码的背景,而不是字体。也许我的字体路径有问题,但为什么只在服务器上......我调查【参考方案2】:

好的,知道了。 验证码仅适用于 PHP 7.2。 Wamp 默认有 7.2,debian 9 有 7.0。

我刚刚正确安装了 7.2,一切都很好。 我的路径问题用 / 而不是 \ (ty Windows...) 解决了。

谢谢大家。

【讨论】:

好地方 - 仅供参考 - 始终使用 / 将是安全的。如果您想显示路径,可以使用常量 DIRECTORY_SEPARATOR 。在这种情况下不需要,因为 / 更简单、更快捷 ;)

以上是关于PHP Captcha 在服务器上不起作用,但在本地工作的主要内容,如果未能解决你的问题,请参考以下文章

与 session_start() 相关的登录时开始但在其他页面上不起作用

require_once在实时服务器上不起作用

在 Ionic 中,为啥路由在 iPhone 上不起作用,但在构建版本和离子服务上起作用

PHP 站点在 linux 上运行,但在 windows 上不运行

在 WCF 中启用了 Cors,但在实时服务器上不起作用

上传文件(图像)在实时服务器上不起作用,但在dev上工作