2011-07-18 35 views
1

我只是爲了好玩而編寫一個小小的PHP程序/頁面。我的最終目標是讓自己上傳一個圖像文件到我的mysql數據庫。然後將該文件調用ASCII字符串,然後將該文件刻成我創建的JPG文件。測試PHP刻錄JPG文件

爲了測試這個,我使用了程序FTK Imager以及我的網絡服務器,結果不是很討厭。當然,我對PHP相當陌生,所以我知道可能有很多事情我不知道我做錯了。所以我希望得到一些指示:)

我的程序 - 使用FTK Imager創建和UNCOMPRESSED ad1圖像文件。我創建了一個包含多個文件的目錄的圖像。 .docx,.pdf,.jpeg等。然後我將這個圖像文件和我的測試頁一起添加到我的webservers目錄中。然後我通過瀏覽器窗口調用頁面。

我被一個單獨的6.這是我的輸出,一個6.我嘗試echo'ing一路上的錯誤,隨着代碼執行加上一些錯誤報告和最好的我可以告訴,$ soff isn由於某種原因沒有達到預期值(沒有準確的數值)。

爲什麼不能得到正確的值?我知道這些是正確的ASCII標頭/尾部簽名。

這是我的腳本,其中包含echo'ing和error部分。

<?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; 
?> 

這是我的網絡瀏覽器的輸出。

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文件驗證了這一點。

我能想到的最好方式是我有一種不同的方式來告訴我的腳本在我的圖像中找到標題/簽名信息的偏移量。

任何信息都非常歡迎!這只是爲了好玩和學習。

謝謝:)

編輯 - 7/22

我一直對我的代碼和關閉。我做了一些編輯,以更好地反映JPEG文件的結構,當它在十六進制中查看時,這是我將搜索的內容。我遇到了一個錯誤,似乎strpos不「看到」0?我的程序幾乎當場就返回結果,頭和一切看起來很大,但strpos什麼的....是找到在JPEG文件的十六進制這些斑點誤報...

False Positive

它正在閱讀這兩個零的每一邊的FFD9,當我需要FFD9在彼此旁邊時...

這裏是我更新的代碼,

<?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在兩個零的每一側找到字符串「FFD9」,因爲00不是在那裏找到它,因爲00是需要進入的字符帳戶。我明白爲什麼strpos在乾草堆裏找不到針,但它在乾草堆裏發現了它。然而,通過更多的想法,我開始想知道strhex函數是從我的get_file_contents字符串中刪除零,以便FF00D9變成FFD9,那麼strhex函數可能會將零填充回來嗎? – Shawn