2013-06-05 4 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 –

+0

을 사용하기 전에 session_start()를 호출해야합니다. 이렇게하면 공격자가 현재 사용자가 액세스 할 수있는 위치에 파일을 쓸 수 있습니다. 파일 이름으로 사용하기 전에 $ _GET [ 'txt'] 내용을 정리하고 싶을 것입니다. – MatsLindh

답변

0

우선,이 코드를 공개적으로 사용하기 전에 몇 가지 보안 문제가 있습니다. 공격자가 거의 모든 시스템에 기록 할 또한 당신이 직접 GET 매개 변수에서 얻을 파일 이름에 쓰기 Why shouldn't I use mysql_* functions in PHP?How to prevent SQL injection in PHP?

보고하여 SQL 주입 문제를 해결 할 것입니다 시작하는 좋은 방법은 있습니다. 입력의 유효성을 확인하십시오. 최소한 basename()과 같은 것을 사용하면 atleast와 동일한 디렉토리에 파일을 보관할 수 있습니다.

그런 다음 실제 문제. 그것은 당신이 선도적 인/다음 .TTF 것와 함께하는 GD 라이브러리의 PHP 버전 fontFile에 시작하지 않는 경우, 사용에 따라 imagettftext manual

에 나와있는 GD 라이브러리의 버전을 실행하고 있는지 수 파일 이름에 추가하면 라이브러리는 라이브러리 정의 글꼴 경로를 따라 해당 파일 이름을 검색하려고 시도합니다.

그래서 그것의 가능한 서버가 실제로 images/fonts/fontname.ttf.ttf을 찾고, $desfon = 'images/fonts/'.$get['font_name'];처럼 사용하고 작동하는지 확인하려고합니다.

또한 단순히 스크립트 상단의 GDFONTPATH 설정하는 좋은 생각 단순히 imagettftext 전화의 내용을 덤프 할 수있는 응용 프로그램을 디버깅 할 $desfon = $get['font_name'];

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

다른 방법을 사용할 수 있습니다 및 그것이 무엇을 말하는지보십시오. 내가 exit 스크립트를 사용하여 실제 이미지를 만들지는 않겠지 만 반환 값을 출력합니다.

<? 
//your script 

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

//rest of script. 
?>