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