2011-07-18 11 views
1

私はちょうど楽しみのための少しのPHPプログラム/ページを作っています。私の究極の目的は、自分自身がmysqlデータベースに画像ファイルをアップロードできるようにすることです。その後、そのファイルをASCII文字列にして、作成したJPGファイルをそのファイルに埋め込みます。テストPHP JPGファイルを作成する

これをテストするために、私はFTK ImagerをWebサーバーとともに使用しましたが、その結果は消えないものでした。私はかなりPHPに新しいので、おそらく私は間違っていることに私は知らない多くのものがあることを知っている。だから私はいくつかのポインタを得ることを望んでいた:

私の手続き - 作成し、FTK Imagerを使用しているunCOMPRESSED ad1画像ファイル。私は、複数のファイルを含むディレクトリのイメージを作成しました。 .docx、.pdf、.jpegなど。私はこのイメージファイルを私のテストページと共に私のwebserversディレクトリに追加しました。その後、ブラウザウィンドウでページを呼び出しました。

これは私の出力で、6です。コードが実行される途中で何らかのエラーが表示されてしまいましたが、何かエラーが報告されていて、$ soff isn理由や目的によって意図された値が得られない(正確な値はありません)

なぜこれが正しい値にならないのですか?私は、これらが正しいASCIIヘッダ/トレーラシグネチャであることを知っています。

ここには、エコーやエラーの部分が含まれたスクリプトがあります。

<?php 
ini_set('display_errors',1); 
error_reporting(E_ALL); 
// Search Criterium 
$jpgs = "ÿØÿà"; 
echo "yoya Start<br />" . $jpgs; 
$jpgeoff = "702"; 
echo "<br />" . $jpgeoff; 
$jpge = "ÿÙ"; 
echo "<br />" . $jpge; 
// Input file to string 
$ipfile = file_get_contents('testimage.ad1'); 
// Input file length for math 
$m1 = strlen($ipfile); 
echo "<br />" . $m1; 
// Check for empty file 
if(isset($ipfile)) { } else { echo "ERROR - Empty File!<br />"; } 
// Set starting offset with first criterium find 
$soff = strpos($ipfile, $jpgs); 
echo "<br />" . $soff; 
// Do math to find where to start substr to cut first part off beginning of string. 
$x1 = ($soff - 1); 
echo "<br />" . $x1; 
$x2 = ($m1 - $soff); 
echo "<br />" . $x2; 
// Execute the final math into cuts. 
$ipfile = substr($ipfile, $x1, $x2); 
// New input file length for more math. 
$m2 = strlen($ipfile); 
echo "<br />" . $m2; 
// Set ending offset with jpgeoff to skip false positives for jpegs, then jpge to find real trailer character. 
$eoff = strpos($ipfile, $jpge, $jpgeoff); 
echo "<br />" . $eoff; 
// Do math to find where to start substr to cut second part off end of string. Start at 0 for beginning of jpg, keep chars via math, cuts rest off. 
$y1 = "0"; 
echo "<br />" . $y1; 
$y2 = ($eoff + 1); 
echo "<br />" . $y2; 
// Execute the final math into cuts. 
$ipfile = substr($ipfile, $y1, $y2); 
// The $ipfile string should now contain the ASCII string of only the JPG file. 
echo $ipfile; 
?> 

ここは私のWebブラウザの出力です。

yoya Start 
ÿØÿà 
702 
ÿÙ 
16542148 

-1 
16542148 
1 
Warning: strpos() [function.strpos]: Offset not contained in string in /var/www/html/test1.php on line 32 


0 
16 

私はここhttp://www.garykessler.net/library/file_sigs.htmlからの私のファイル署名情報を参照し、FTKイメージャーで私のJPGファイルを表示することによって、これを確認しました。

最高の私は、私の画像にヘッダ/シグネチャ情報のオフセットを見つけるためにスクリプトに言わなければならない別の方法があることがわかります。

すべての情報は大歓迎です!これは楽しく学習するためのものです。

ありがとうございました:)

EDIT - 7/22

を私はオフとの私のコードに取り組んできました。 JPEGファイルの構造を16進数で表示したときの構造をよりよく反映するように編集しました.1つのエラーが発生しました。strposは0を表示しません。私のプログラムは、ヘッダーとすべてがとてもよく似合う、結果にほぼスポット戻っているが、strposか何か.... ...

False Positive

をJPEGファイルの六角におけるこれらのスポットで偽陽性発見されます

FFD9を2つのゼロの両側で読み込んでいます。ここで

は私の更新されたコード、

<?php 
ini_set('display_errors',1); 
error_reporting(E_ALL); 
// HEX/STR Functions for converting string to hex and vice versa 
function strhex($string) 
{ 
    $hex=''; 
    for ($i=0; $i < strlen($string); $i++) 
    { 
     $hex .= dechex(ord($string[$i])); 
    } 
    return $hex; 
} 

function hexstr($hex) 
{ 
    $string=''; 
    for ($i=0; $i < strlen($hex)-1; $i+=2) 
    { 
     $string .= chr(hexdec($hex[$i].$hex[$i+1])); 
    } 
    return $string; 
} 
// Search Criterium 
$jpgs = "ffd8ff"; 
echo "yoya Start<br />" . $jpgs; 
echo "<br />jpgoff " . $jpgeoff; 
$jpge = "ffd9"; 
echo "<br />jpge " . $jpge; 
// Input file to string 
$ipfileg = file_get_contents('ti.ad1'); 
// Turn to hex 
$ipfile = strhex($ipfileg); 
// Input file length for math 
$m1 = strlen($ipfile); 
echo "<br />m1 " . $m1; 
// Check for empty file 
if(isset($ipfile)) { } else { echo "ERROR - Empty File!<br />"; } 
// Set starting offset with first criterium find 
$soff = strpos($ipfile, $jpgs); 
echo "<br />soff " . $soff; 
// Do math to find where to start substr to cut first part off beginning of string. 
$x1 = $soff; 
echo "<br />x1 " . $x1; 
$x2 = ($m1 - $soff); 
echo "<br />x2 " . $x2; 
// Execute the final math into cuts. 
$ipfile = substr($ipfile, $x1, $x2); 
// New input file length for more math. 
$m2 = strlen($ipfile); 
echo "<br />m2 " . $m2; 
// Set ending offset. My jpeg test files had three hits for FFD9, so I need to skip two. 
$eoff1 = strpos($ipfile, $jpge); 
$eoff2 = ($eoff1 + 1); 
$eoff3 = strpos($ipfile, $jpge, $eoff2); 
$eoff4 = ($eoff3 + 1); 
$eoff = strpos($ipfile, $jpge, $eoff4); 
echo "<br />eoff " . $eoff; 
// Do math to find where to start substr to cut second part off end of string. Start at 0 for beginning of jpg, keep chars via math, cuts rest off. 
$y1 = "0"; 
echo "<br />y1 " . $y1; 
$y2 = ($eoff + 4); 
echo "<br />y2 " . $y2; 
// Execute the final math into cuts. 
$ipfile = substr($ipfile, $y1, $y2); 
// Convert hex to ASCII string. 
$ipfile = hexstr($ipfile); 
// The $ipfile string should now contain the ASCII string of only the JPG file. 
echo "<br />final " . $ipfile; 
// Create JPG file. 
file_put_contents("test.jpg", $ipfile); 
?> 

答えて

1

問題はここに、確かにstrpos()関数ではないですテストです:

$needle = "ÿÙ"; 
$haystack1 = "afafjkaskÿ\0Ùasdf"; 
$haystack2 = "afafjkaskÿÙasdf"; 
var_dump(strpos($haystack1, $needle)); 
var_dump(strpos($haystack2, $needle)); 

結果:

bool(false) 
int(9) 

strpos()が動作しています正確にここで期待どおりに。

+0

私はあなたの例を理解していますか分かりません。私の最後に編集されたスクリプトでは、私の針は "FFD9"ですが、strposは2つの0の両側に文字列 "FFD9"を見つけています。アカウント。私はstrposがhaystack 1で針を見つけられなかった理由を見るが、それはhaystack 2でそれを見つけた。しかし、もっと考えてみると、FF00D9がFFD9に変わるように、strhex関数がget_file_contents文字列からゼロを取り除いているのだろうかと思っています。おそらくstrhex関数は0を埋めます。 – Shawn

関連する問題