2013-06-05 57 views
2

我正在使用php创建图像,我几乎编码了它,但是我在一个非常重要的点上发现了一个问题,我希望在该图像中选择我选择的字体系列,但只有当我选择字体系列时,才会使用默认字体。此逻辑运行不正常。当我没有选择任何字体家族的默认字体运行,并显示我的输入,但是当我选择任何字体,然后它也运行和现有的图像覆盖,但它没有显示我的屏幕上的输入。在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="" />'; 
?> 
+1

如果只有您的图像没有显示是因为浏览器缓存。尝试使用图像源添加时间戳,因此它总是使用最新的图像,如

+0

首先,您必须在使用$ _SESSION之前调用session_start() –

+0

这将允许攻击者在当前用户有权访问的任何地方写入文件。在使用它作为文件名之前,您可能需要清理$ _GET ['txt']的内容。 – MatsLindh

回答

0

首先,你有几个安全问题,你真的应该在任何地方使用这个代码之前公开处理。启动会通过看Why shouldn't I use mysql_* functions in PHP?How to prevent SQL injection in PHP?

而且写入文件名,你从GET参数直接获得被固定SQL注入问题的一个好办法允许攻击者在你的系统几乎在任何地方写。确保你验证输入。至少使用类似basename()的东西来至少将文件保存在同一目录中。

然后到您的实际问题。这可能是你正在运行的版本在imagettftext manual

提到根据其GD库的PHP版本使用,当fontfile没有开始与一家领先/时则.ttf将GD库的被附加到文件名后,库将尝试沿着库定义的字体路径搜索该文件名。

因此,它可能是您的服务器实际上是寻找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. 
?>