1. 程式人生 > >Java專案簡單安全處理

Java專案簡單安全處理

一、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));
}