您好,登錄后才能下訂單哦!
前言
Java 修改文件權(quán)限這個應(yīng)該是老生常談的功能,但是最近發(fā)現(xiàn)以前寫的代碼有一點點安全隱患,所以把代碼改成NIO的方式,下面會介紹2種修改文件,文件夾權(quán)限的方法。
使用File類
這個方式是以前最常見的方式,但是這個方式有點缺點在LINUX或者UNIX系統(tǒng)下,需要顯示的指定權(quán)限為440,770等就顯得不是那么好用了。
File dirFile = new File(dirPath); dirFile.setReadable(true, false); dirFile.setExecutable(true, false); dirFile.setWritable(true, false);
因此我們通常會采用一些workaround的方式修改文件夾權(quán)限,必須我需要在LINUX上設(shè)置權(quán)限為770
Runtime runtime = getRuntime(); String command = "chmod 770 " + dirPath; try { Process process = runtime.exec(command); process.waitFor(); int existValue = process.exitValue(); if(existValue != 0){ logger.log(Level.SEVERE, "Change file permission failed."); } } catch (Exception e) { logger.log(Level.SEVERE, "Command execute failed.", e); }
這種方式會有一個問題,當(dāng)dirPath中包含空格或者分號的時候,不僅僅對功能有影響,對安全也是有隱患的。
情況1: dirPath = /home/a aa.txt
在LINUX系統(tǒng)中執(zhí)行的命令是 chmod 770 /home/a aa.txt
, 系統(tǒng)會認(rèn)為修改/home/a 和aa.txt 的文件權(quán)限為770,修改文件權(quán)限失敗
情況2: 當(dāng)dirPath = /home/aaa.txt;rm test.txt
這時在LINUX系統(tǒng)中會執(zhí)行2條指令:
chmod 770 /home/omc/aaa.txt rm test.txt
這時就會出現(xiàn)安全隱患。
NIO方式
private void changeFolderPermission(File dirFile) throws IOException { Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>(); perms.add(PosixFilePermission.OWNER_READ); perms.add(PosixFilePermission.OWNER_WRITE); perms.add(PosixFilePermission.OWNER_EXECUTE); perms.add(PosixFilePermission.GROUP_READ); perms.add(PosixFilePermission.GROUP_WRITE); perms.add(PosixFilePermission.GROUP_EXECUTE); try { Path path = Paths.get(dirFile.getAbsolutePath()); Files.setPosixFilePermissions(path, perms); } catch (Exception e) { logger.log(Level.SEVERE, "Change folder " + dirFile.getAbsolutePath() + " permission failed.", e); } }
從API 查詢知道,NIO的這種方式原生支持LINUX和UNIX低層系統(tǒng),但測試發(fā)現(xiàn)在Windows系統(tǒng)下面不區(qū)分文件所有者和其它似乎沒有效果,這個和實用File是一致的。從底層代碼發(fā)現(xiàn),還是使用的File類
另外可能會拋出UnsupportedOperationException IOException SecurityException
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。