Ⅰ PNG圖片中植入php代碼
PNG圖片中植入PHP代碼的方式
在PNG圖片中植入PHP代碼,通常是在存在文件上傳漏洞的情況下實現的,這些漏洞允許攻擊者上傳包含惡意代碼的文件。根據防護水平的不同,存在多種代碼植入方式。以下是四種主要的PNG圖片代碼植入方式:
一、基礎的PNG圖片代碼植入
這種方式通常發生在沒有嚴格防護的文件上傳功能中。攻擊者可以通過以下兩種方法在PNG圖片中植入PHP代碼:
PNG注釋:PNG圖片格式允許添加註釋到文件中,這些注釋可以保存一些元數據。攻擊者可以使用工具(如exiftool)在PNG圖片中添加註釋,並將PHP代碼嵌入其中。然後,將文件後綴從PNG修改為PHP並上傳,即可實現PHP代碼的執行。
直接附加:攻擊者還可以通過echo命令直接將PHP代碼附加到PNG文件的末尾,並修改文件後綴為PHP進行上傳。
二、PHP-GD文件壓縮代碼植入
當圖片文件被上傳後,伺服器可能會使用PHP-GD庫對圖片進行裁剪、壓縮或格式轉換。在這種情況下,直接代碼植入的PNG圖片經過壓縮後會失去植入的代碼。因此,攻擊者需要採用更隱蔽的方式:
PLTE塊:PNG文件包含關鍵塊和附加數據塊。關鍵塊是PNG文件的必要信息塊,而附加數據塊則不是必需的。在壓縮過程中,附加數據塊的內容會被刪除以減小文件大小。因此,攻擊者可以將PHP代碼植入到關鍵塊中的PLTE塊(調色板)里。PLTE塊包含1到256的調色板入口,每三個位元組構成一組(Red、Green、Blue),因此理論上可以插入768位元組的代碼(需被3整除)。
綜上所述,根據PNG圖片處理方式的不同,攻擊者可以採用不同的代碼植入方式。這些方式都利用了文件上傳漏洞和圖片處理過程中的安全缺陷,從而實現了PHP代碼的執行。因此,在開發過程中,應嚴格檢查文件上傳功能的安全性,避免這些漏洞的出現。
Ⅱ 求php圖片縮放處理函數
在PHP網站開發過程中,如果建立的網站涉及大量的圖片處理,必然涉及到圖片的上傳和縮放,保持圖片不失真,進行圖片縮放。使用之前需要下載安裝GD庫,以支持PHP圖片處理。下面結合代碼講解具體的PHP圖片縮放處理的思路。
function resizeImage($im,$maxwidth,$maxheight,$name,$filetype)
{
$pic_width = imagesx($im);
$pic_height = imagesy($im);
if(($maxwidth && $pic_width > $maxwidth) ($maxheight && $pic_height > $maxheight))
{
if($maxwidth && $pic_width>$maxwidth)
{
$widthratio = $maxwidth/$pic_width;
$resizewidth_tag = true;
}
if($maxheight && $pic_height>$maxheight)
{
$heightratio = $maxheight/$pic_height;
$resizeheight_tag = true;
}
if($resizewidth_tag && $resizeheight_tag)
{
if($widthratio<$heightratio)
$ratio = $widthratio;
else
$ratio = $heightratio;
}
if($resizewidth_tag && !$resizeheight_tag)
$ratio = $widthratio;
if($resizeheight_tag && !$resizewidth_tag)
$ratio = $heightratio;
$newwidth = $pic_width * $ratio;
$newheight = $pic_height * $ratio;
if(function_exists("imageresampled"))
{
$newim = imagecreatetruecolor($newwidth,$newheight);
imageresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
}
else
{
$newim = imagecreate($newwidth,$newheight);
imageresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
}
$name = $name.$filetype;
imagejpeg($newim,$name);
imagedestroy($newim);
}
else
{
$name = $name.$filetype;
imagejpeg($im,$name);
}
}
參數說明:
$im 圖片對象,應用函數之前,需要用imagecreatefromjpeg()讀取圖片對象,如果PHP環境支持PNG,GIF,也可使用imagecreatefromgif(),imagecreatefrompng();
$maxwidth 定義生成圖片的最大寬度(單位:像素)
$maxheight 生成圖片的最大高度(單位:像素)
$name 生成的圖片名
$filetype 最終生成的圖片類型(.jpg/.png/.gif)
代碼注釋:
第3~4行:讀取需要縮放的圖片實際寬高
第8~26行:通過計算實際圖片寬高與需要生成圖片的寬高的壓縮比例最終得出進行圖片縮放是根據寬度還是高度進行縮放,當前程序是根據寬度進行圖片縮放。如果想根據高度進行圖片縮放,可以將第22行的語句改成$widthratio>$heightratio
第28~31行:如果實際圖片的長度或者寬度小於規定生成圖片的長度或者寬度,則要麼根據長度進行圖片縮放,要麼根據寬度進行圖片縮放。
第33~34行:計算最終縮放生成的圖片長寬。
第36~45行:根據計算出的最終生成圖片的長寬改變圖片大小,有兩種改變圖片大小的方法:ImageCopyResized()函數在所有GD版本中有效,但其縮放圖像的演算法比較粗糙。ImageCopyResamples(),其像素插值演算法得到的圖像邊緣比較平滑,但該函數的速度比ImageCopyResized()慢。
第47~49行:最終生成經過處理後的圖片,如果需要生成GIF或PNG,需要將imagejpeg()函數改成imagegif()或imagepng()
第51~56行:如果實際圖片的長寬小於規定生成的圖片長寬,則保持圖片原樣,同理,如果需要生成GIF或PNG,需要將imagejpeg()函數改成imagegif()或imagepng()。
特別說明:
GD庫1.6.2版以前支持GIF格式,但因GIF格式使用LZW演演算法牽涉專利權,因此在GD1.6.2版之後不支持GIF的格式。如果是WINDOWS的環境,只要進入PHP.INI文件找到extension=php_gd2.dll,將#去除,重啟APACHE即可。如果是Linux環境,又想支持GIF,PNG,JPEG,需要去下載libpng,zlib,以及freetype字體並安裝。
OK,PHP圖片壓縮函數完成,最後概述一下整個處理的思路:
通過計算實際圖片的長寬與規定生成圖片的長寬之間的縮放比例,根據實際的需求(按照寬度還是按照高度進行圖片縮放)計算出最終生成圖片的大小,然後應用PHP圖片處理函數對圖片進行處理,最後輸出圖片。
以上就是關於PHP圖片處理中如何對圖片進行壓縮並保持不失真的函數說明。
Ⅲ php 如何檢查圖片是否已經加過水印 求解
在php採集的時候,尤其是大量的自動採集的時候,加了水印的圖片想程序自動鑒別。
你是這種想法嗎?
這種想法可以,但沒有這種方法。以前沒有,今後也不會有。
水印和圖片已經形成一張新圖片了,不要說PHP對圖片沒有識別能力,就算PHP對圖片有識別能力,它也沒有辦法識別圖片上哪個屬於圖片內容,哪個屬於水印內容。
但是,我們就沒有辦法處理水印的問題嗎?辦法肯定是有的。我提供幾種思路:
1、我們自己建立一個無水印網站地址庫,這個由我們日常來管理。php通過圖片的真實地址,屬於無水印網站地址范圍,就認為是無水印的。不在范圍內的,就作為有水印處理。
2、如果我們固定從某個大站取圖片,它的圖片有的有水印,有的無水印,而且有水印的都是那麼固定的格式,那我們就根據它的方法,在水印上添加我們的水印。但這不是萬能的,如果它在圖片上全部鋪滿它的logo或者網址,像貼滿膏葯一樣無法下手,我們只能對此說sorry,換個網站吧。