2

我正在使用 php 创建图像,我几乎对其进行了编码,但我坚持了一个非常重要的点,我希望在该图像中选择我选择的字体系列,但只有当我选择字体系列时才会运行默认字体。此逻辑运行不正常。当我没有选择任何字体系列时,默认字体运行并向我显示输入,但是当我选择任何字体时,它也会运行并覆盖现有图像,但它没有在屏幕上显示输入。

请告诉我是什么问题。这是我的php文件代码:

<?php
include_once('includes/includes.inc.php');
if(isset($_GET['txt'])){
$txt = $_GET['txt'];
$_SESSION['txt'] = $txt;
}

if(!isset($_SESSION['rand'])){
    $rand = mt_rand(100,1000);
    $_SESSION['rand'] = $rand;
}

    $im = @imagecreate(288, 288) or die("Cannot Initialize new GD image stream");
    $background_color = imagecolorallocate($im, 230, 248, 248);
    $text_color = imagecolorallocate($im, 85, 85, 85);



    if(isset($_GET['Smile'])){
        $query = mysql_query("SELECT * FROm tbl_fonts WHERE font_name = '".$_GET['Smile']."'");
        $get = mysql_fetch_array($query);
        $desfon = 'images/fonts/'.$get['font_name'].'.ttf';
        //echo $desfon;
        imagettftext($im, 55, 0, 155, 55, $text_color, $desfon, $_SESSION['txt']);
    }
    else{
        imagestring($im, 55, 155, 55,  $_SESSION['txt'], $text_color);
    }

    header("Content-Type: image/png");
    $filename1 = $_SESSION['txt'].$_SESSION['rand'].'.png';
    imagepng($im,$filename);
    echo '<img src="'.$filename.'" alt="" />';
?>
4

1 回答 1

0

首先,在任何公共场合使用此代码之前,您确实应该处理一些安全问题。一个好的开始方法是通过查看为什么我不应该在 PHP 中使用 mysql_* 函数来解决 SQL 注入问题?以及如何防止 PHP 中的 SQL 注入?

此外,写入您直接从GET参数获取的文件名允许攻击者在您系统的几乎任何地方写入。确保验证输入。至少使用basename()之类的东西来至少将文件保存在同一目录中。

然后到你的实际问题。可能是您正在运行imagettftext 手册中提到的 GD 库版本

根据 PHP 使用的 GD 库的版本,当 fontfile 不以前导 / 开头时,.ttf 将附加到文件名,并且库将尝试沿着库定义的字体路径搜索该文件名。

因此,您的服务器可能实际上正在寻找它,请images/fonts/fontname.ttf.ttf尝试使用它$desfon = 'images/fonts/'.$get['font_name'];,看看它是否有效。

简单地将 设置GDFONTPATH在脚本的顶部并使用$desfon = $get['font_name'];

<?php
// Set the enviroment variable for GD
putenv('GDFONTPATH=' . dirname(__FILE__).'/images/fonts/');
?>

调试应用程序的其他方法可能是转储imagettftext调用的内容并查看它的内容。请注意,我将exit编写脚本,因此它不会创建实际图像,而只是输出返回值。

<?
//your script

var_dump(imagettftext($im, 55, 0, 155, 55, $text_color, $desfon, $_SESSION['txt']));
exit();

//rest of script.
?>
于 2013-06-05T10:51:53.540 回答