Java專案簡單安全處理
阿新 • • 發佈:2019-01-04
一、URL中引數顯示問題,解決方案:
1、普通Get請求修改為Post請求
2、引數加密(js加密,Java解密)
二、Mybatis模糊查詢中,sql拼接問題,解決方案方案:
1、使用安全的符號和方法,xml中拼接示例:
<if test="stateList != null">
state in
<foreach collection="stateList" item="sta" index="index" open="("
separator="," close=")">
#{stateList[${index}]}
</foreach>
</if>
<if test="title != null and title != ''">
and title like concat('%',#{title},'%')
</if>
2、Java中轉義特殊字元,Java中字元處理示例:
param = param.replace("%", "\\%");
param = param.replace("_", "\\_");
param = param.replace(",", "\\,");
param = param.replace("'" , "\\'");
param = param.replace("/", "//");
param = param.replace("\\", "\\\\");
三、檔案上傳安全問題
解決方案:判斷檔名、請求ContentType和檔案頭內容。
檔案頭內容判斷:
常見檔案型別識別
常用檔案的頭資訊:
JPEG (jpg),檔案頭:FFD8FFE1
PNG (png),檔案頭:89504E47
GIF (gif),檔案頭:47494638
TIFF (tif),檔案頭:49492A00
Windows Bitmap (bmp),檔案頭:424D
CAD (dwg),檔案頭:41433130
Adobe Photoshop (psd),檔案頭:38425053
Rich Text Format (rtf),檔案頭:7B5C727466
XML (xml),檔案頭:3C3F786D6C
HTML (html),檔案頭:68746D6C3E
Email [thorough only] (eml),檔案頭:44656C69766572792D646174653A
Outlook Express (dbx),檔案頭:CFAD12FEC5FD746F
Outlook (pst),檔案頭:2142444E
MS Word/Excel (xls.or.doc),檔案頭:D0CF11E0
MS Access (mdb),檔案頭:5374616E64617264204A
WordPerfect (wpd),檔案頭:FF575043
Postscript (eps.or.ps),檔案頭:252150532D41646F6265
Adobe Acrobat (pdf),檔案頭:255044462D312E
Quicken (qdf),檔案頭:AC9EBD8F
Windows Password (pwl),檔案頭:E3828596
ZIP Archive (zip),檔案頭:504B0304
RAR Archive (rar),檔案頭:52617221
Wave (wav),檔案頭:57415645
AVI (avi),檔案頭:41564920
Real Audio (ram),檔案頭:2E7261FD
Real Media (rm),檔案頭:2E524D46
MPEG (mpg),檔案頭:000001BA
MPEG (mpg),檔案頭:000001B3
Quicktime (mov),檔案頭:6D6F6F76
Windows Media (asf),檔案頭:3026B2758E66CF11
MIDI (mid),檔案頭:4D546864
java附件上傳時後臺驗證上傳檔案的合法性
public static Map<String, String> mFileTypes = new HashMap<String, String>();
static {
// imagesFFD8FFE1
mFileTypes.put("FFD8FFE1", ".jpg");
mFileTypes.put("FFD8FFE0", ".jpg");
mFileTypes.put("89504E47", ".png");
mFileTypes.put("47494638", ".gif");
mFileTypes.put("49492A00", ".tif");
mFileTypes.put("424D", ".bmp");
// 辦公文件類
mFileTypes.put("D0CF11E0", ".doc"); // ppt、doc、xls
mFileTypes.put("504B0304", ".docx"); // pptx、docx、xlsx
/** 注意由於文字文件錄入內容過多,則讀取檔案頭時較為多變-START **/
mFileTypes.put("0D0A0D0A", ".txt"); // txt
mFileTypes.put("0D0A2D2D", ".txt"); // txt
mFileTypes.put("0D0AB4B4", ".txt"); // txt
mFileTypes.put("B4B4BDA8", ".txt"); // 檔案頭部為漢字
mFileTypes.put("73646673", ".txt"); // txt,檔案頭部為英文字母
mFileTypes.put("32323232", ".txt"); // txt,檔案頭部內容為數字
mFileTypes.put("0D0A09B4", ".txt"); // txt,檔案頭部內容為數字
mFileTypes.put("3132330D", ".txt"); // txt,檔案頭部內容為數字
/** 注意由於文字文件錄入內容過多,則讀取檔案頭時較為多變-END **/
mFileTypes.put("25504446", ".pdf");
mFileTypes.put("255044462D312E", ".pdf");
// 壓縮包
mFileTypes.put("52617221", ".rar");
mFileTypes.put("1F8B08", ".gz");
}
/**
* 判斷上傳的檔案是否合法
*
* @param file
* 檔案
* @param contentType
* 是否指定型別
* @param typeStr
* 檔案型別字尾名(.jpg,.png,.gif,.jpeg)
* @return
*/
public Boolean checkFileIllegal(MultipartFile file, String fileName, String typeStr) {
if (!file.isEmpty()) {
if (StringUtils.isNotBlank(file.getContentType())) {
String type = null;
try {
type = getFileType(file.getInputStream());
} catch (IOException e) {
logger.error("checkFileIllegal->getFileType->error:" + e.getMessage());
return false;
}
if (null != type && -1 != typeStr.indexOf(type)) {
int index = fileName.lastIndexOf(".");
if (StringUtils.isNotBlank(fileName) && -1 != index) {
String fileType = fileName.substring(index).toLowerCase();
if (-1 != typeStr.indexOf(fileType)) {
return true;
}
}
}
}
}
return false;
}
/**
* 根據檔案的輸入流獲取檔案頭資訊
* @return 檔案頭資訊
*/
public static String getFileType(InputStream is) {
byte[] b = new byte[4];
if (is != null) {
try {
is.read(b, 0, b.length);
} catch (IOException e) {
e.printStackTrace();
}
}
return mFileTypes.get(getFileHeader(b));
}