為了防止一些使用者將一些病毒檔案上傳到伺服器,我們一般需要對上傳的檔案做合法性校驗, 當時有時候簡單的字尾和contenttype校驗任然還有風險,下面我們一起來討論一下上傳的檔案需要做哪些合法性校驗。
1、檔案字尾校驗
這層校驗應該說是最基本的校驗了,我們不能允許使用者上傳一些exe、jsp、php、asp、html等可執行的檔案。
2、contenttype校驗
contenttype是內容型別,它會告訴瀏覽器用什麼形式、什麼編碼來讀取這個檔案。因此檔案字尾和contenttype有乙個對應關係,上傳檔案的字尾和contenttype應該是對應的,如果不對應則上傳資訊已被篡改。字尾和contenttype關係表參考tomcat下conf/web.xml中。
3、上傳校驗
如果需要上傳的檔案是,必須對上傳的檔案是否是乙個進行檢驗,否則如果使用者將乙個html檔案修改字尾為並上傳,在顯示該時就會執行html檔案中的內容,帶來跨域攻擊風險。
校驗方式
(1)、通過imageio讀取檔案,如果丟擲異常或者讀取後的物件為null,表示該檔案不是
/**
* 通過讀取檔案資訊判斷檔案是否是
* @param imagefile
* @return
*/public static boolean checkimagefilebyread(file imagefile)
} catch (ioexception e)
return true;
}
(2)、通過imageio讀取檔案成流,如果丟擲異常或者讀取後的流物件為null,表示檔案不是
/**
* 通過將檔案轉換為流方式監測檔案是否為
* @param imagefile
* @return
*/public static boolean checkimagefilebyis(file imagefile)
is.close();
} catch (ioexception e)
return true;
}
(3)有些中可能會嵌入iframe,以同樣會導致跨域攻擊,可以採用新增水印方式解決
/**
* 給新增水印、可設定水印旋轉角度
* * @param iconpath
* 水印路徑
* @param srcimgpath
* 源路徑
* @param targerpath
* 目標路徑
* @param degree
* 水印旋轉角度
* @param width
* 寬度(與左相比)
* @param height
* 高度(與頂相比)
* @param clarity
* 透明度(小於1的數)越接近0越透明
*/public static void watermarkimagebyicon(string iconpath, string srcimgpath,
string targerpath, integer degree, integer width, integer height,
float clarity)
// 水印圖象的路徑 水印一般為gif或者png的,這樣可設定透明度
imageicon imgicon = new imageicon(iconpath);
// 得到image物件。
image img = imgicon.getimage();
float alpha = clarity; // 透明度
g.setcomposite(alphacomposite.getinstance(alphacomposite.src_atop,
alpha));
// 表示水印的位置
g.drawimage(img, width, height, null);
g.setcomposite(alphacomposite.getinstance(alphacomposite.src_over));
g.dispose();
os = new fileoutputstream(targerpath);
// 生成
system.out.println("新增水印完成!");
} catch (exception e) finally catch (exception e) }}
/*** 給新增水印、可設定水印旋轉角度
* * @param logotext
* 水印文字
* @param srcimgpath
* 源路徑
* @param targerpath
* 目標路徑
* @param degree
* 水印旋轉角度
* @param width
* 寬度(與左相比)
* @param height
* 高度(與頂相比)
* @param clarity
* 透明度(小於1的數)越接近0越透明
*/public static void watermarkbytext(string logotext, string srcimgpath,
string targerpath, integer degree, integer width, integer height,
float clarity)
// 設定顏色
g.setcolor(color.red);
// 設定 font
g.setfont(new font("宋體", font.bold, 30));
float alpha = clarity;
g.setcomposite(alphacomposite.getinstance(alphacomposite.src_atop,
alpha));
// 第一引數->設定的內容,後面兩個引數->文字在上的座標位置(x,y) .
g.drawstring(logotext, width, height);
g.dispose();
os = new fileoutputstream(targerpath);
// 生成
system.out.println("新增水印文字完成!");
} catch (exception e) finally catch (exception e)
try catch (exception e)
}}
php 檔案上傳校驗 php實現檔案上傳基本驗證
html部分 檔案上傳 php服務端部分 header content type text html charset utf 8 預定義變數 print r files 可以顯示錯誤號,根據錯誤號來定位錯誤資訊 filename files myfile name type files myfile...
JAVA Execl檔案校驗
通過poi魔數判斷檔案型別 public static boolean i eclfile inputstream inputstream catch ioexception e return res 以上是通過流讀取檔案頭的魔數來校驗檔案型別。可避免使用者直接修改其他型別檔案字尾為 xls 或 x...
Json檔案校驗
internal class jsonsplitverify internal static bool isjson string json region 開頭是否問json 開頭是否問json private static bool isjsonstart ref string json s e ...