Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中创建图像_Php_Ajax - Fatal编程技术网

在php中创建图像

在php中创建图像,php,ajax,Php,Ajax,我正在使用php创建图像,我几乎编写了它,但我在一个非常重要的点上遇到了问题,我希望在该图像中使用我选择的字体系列,但只有当我选择字体系列时,否则默认字体才会运行。此逻辑运行不正常。当我没有选择任何字体系列时,默认字体会运行并显示输入,但当我选择任何字体时,它也会运行并覆盖现有图像,但不会在屏幕上显示输入 请告诉我是什么问题。以下是我的php文件代码: <?php include_once('includes/includes.inc.php'); if(isset($_GET['txt'

我正在使用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="" />';
?>

首先,在使用此代码之前,您确实需要处理一些安全问题。一个好的开始方法是通过查看和修复SQL注入问题

此外,通过写入直接从
get
参数获取的文件名,攻击者几乎可以在系统中的任何位置写入文件。确保您验证了输入。至少使用类似的方法将文件保存在同一目录中

然后是你的实际问题。可能是您正在运行的GD库版本在

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

因此,您的服务器可能实际上正在查找
图像/font/fontname.ttf.ttf
,请尝试像
那样使用它$desfon='images/font/'。$get['font\u name'
并查看它是否有效

在脚本的顶部简单地设置
GDFONTPATH
,然后简单地使用
$desfon=$get['font\u name'],这可能也是一个好主意

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

如果只有您的图像没有显示,那是因为浏览器缓存。尝试在图像源中添加时间戳,使其始终使用最新的图像,例如,在使用$\u session之前,必须首先调用session_start()。这将允许攻击者在当前用户有权访问的任何位置写入文件。在将$\u GET['txt']用作文件名之前,您可能需要清理其内容。
<?
//your script

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

//rest of script.
?>