最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java安全編碼之文件和共享目錄的安全性

 更新時間:2021年06月30日 15:48:24   作者:flydean  
Java程序是跨平臺的,可以運行在windows也可以運行在linux。但是平臺不同,平臺中的文件權(quán)限也是不同的。windows大家經(jīng)常使用,并且是可視化的權(quán)限管理,這里就不多講了。本文主要講講linux下面的文件的權(quán)限和安全性問題,并且探討一下如何在java程序中考慮文件的安全性

一、linux下的文件基本權(quán)限

chmod是linux下面的權(quán)限管理命令,我們可以通過chmod來對文件的權(quán)限進行修改。

普通文件的權(quán)限有三種,rwx分別是讀,寫和執(zhí)行。再加上三個用戶分組:owner,group,other 我們可以很方便的使用三個0-7的數(shù)字來表示一個文件的權(quán)限。

舉個例子,我們創(chuàng)建一個文件:

touch test.log

看一下默認的文件權(quán)限:

ll test.log

-rw-r--r--  1 flydean  wheel     0B  8 16 10:36 test.log

默認的文件權(quán)限是644,也就是說owner權(quán)限是讀寫,group權(quán)限是讀,其他權(quán)限是讀。

我們可以使用chmod命令對其進行修改,比如:

chmod 777 test.log

ll test.log

-rwxrwxrwx  1 flydean  wheel     0B  8 16 10:36 test.log

可以看出權(quán)限被修改成為777。

二、linux文件的特殊權(quán)限

講完普通權(quán)限,我們接下來講一下linux文件中的特殊權(quán)限。

2.1、Set UID 和 Set GID

考慮一個常用的修改密碼的例子,修改密碼調(diào)用的是/usr/bin/passwd,看下這個文件的權(quán)限:

ll /usr/bin/passwd

-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

可以看到有個很奇怪的s權(quán)限。這個s是什么意思呢?s實際是x的變種,是一種特殊的可執(zhí)行權(quán)限。

特殊在哪里呢?passwd是修改用戶的密碼,密碼文件實際上是存放在 /etc/shadow中的。

我們看下/etc/shadow的權(quán)限:

ll /etc/shadow

---------- 1 root root 707 Jan  2  2020 /etc/shadow

/etc/shadow的owner是root,只有root才權(quán)限強行寫入這個文件。

那么問題來了,普通用戶調(diào)用passwd是怎么修改的/etc/shadow呢?

這就是s的妙用,s表示Set UID,簡稱為SUID,這個UID表示User的ID,而User表示這個程序(/usr/bin/passwd)的擁有者(root),那么我們在調(diào)用passwd的過程時候,就會暫時擁有passwd owner的權(quán)限,也就是root權(quán)限。

注意,SUID只能用在二進制文件中,它是對x權(quán)限的一個替換,并且SUID對目錄是無效的。

同樣的,我們也可以給group設(shè)置UID權(quán)限,也就是Set GID。

不同的是SGID可以使用在文件和目錄兩個地方。

用在文件中是和SUID一樣的,用在目錄中的意思是在該目錄中所建的文件或目錄的用戶組都和該目錄的用戶組是一樣的。

2.2、Sticky Bit

Sticky Bit表示的是特殊的other權(quán)限,用t來表示。

/tmp目錄就是一個Sticky Bit的例子: drwxrwxrwt 。

SBit對目錄的作用是:“在具有SBit的目錄下,用戶若在該目錄下具有w及x權(quán)限,則當用戶在該目錄下建立文件或目錄時,只有文件擁有者與root才有權(quán)力刪除”

這個特性就是為了保護我們在共享目錄下的文件不被別人刪除。

2.3、SUID/SGID/SBIT權(quán)限設(shè)置

怎么設(shè)置這些權(quán)限呢?

普通權(quán)限我們是用3個數(shù)字來表示的,我們可以在3個數(shù)字之前再加上一個數(shù)字表示SUID/SGID/SBIT權(quán)限。

和普通權(quán)限一樣,我們用4來表示SUID,2表示SGID,1表示SBIT。

舉個例子:

touch test

chmod 6755 test

ll test

-rwsr-sr-x 1 crawler crawler 0 Aug 16 11:43 test

注意,有時候我們會遇到大寫的S與T的情況,這種情況出現(xiàn)在user、group以及others都沒有x這個可執(zhí)行的標志,所以大寫的S和T表示為空。

三、文件隱藏屬性

有些linux系統(tǒng)提供了chattr命令來設(shè)置文件隱藏屬性。

我們看下chattr的使用:

Usage: chattr [-RVf] [-+=aAcCdDeijsStTu] [-v version] files...

參數(shù):

  • 增加某個特殊參數(shù),其他原本存在的參數(shù)不動。
  • 刪除某個特殊參數(shù),其他原本存在的參數(shù)不動。

= : 設(shè)置一定,且僅有后面接的參數(shù)

A : 當設(shè)置了A屬性時,這個文件(或目錄)的存取時間atime(access)將不可被修改,可避免例如手提電腦有磁盤I/O錯誤的情況發(fā)生。

S : 這個功能有點類似sync.就是將數(shù)據(jù)同步寫入磁盤中??梢杂行У乇苊鈹?shù)據(jù)流失。

a : 設(shè)置a之后,這個文件將只能增加數(shù)據(jù),而不能刪除,只有root才能設(shè)置這個屬性。

c : 這個屬性設(shè)置之后,將會自動將此文件“壓縮”,在讀取的時候?qū)詣咏鈮嚎s,但在存儲的時候,將會先進行壓縮后再存儲(對于大文件有用)。

d : 當執(zhí)行dump(備份)程序的時候,設(shè)置d屬性將可使該文件(或目錄)具有轉(zhuǎn)儲功效。

i : i的作用很大。它可以讓一個文件“不能被刪除、改名、設(shè)置連接,也無法寫入或新增數(shù)據(jù)”。對于系統(tǒng)安全性有相當大的幫助。

j : 當使用ext3文件系統(tǒng)格式時,設(shè)置j屬性將會使文件在寫入時先記錄在journal中。但是,當文件系統(tǒng)設(shè)置參數(shù)為data=journalled時,由于已經(jīng)設(shè)置日志了,所以這個屬性無效。

s : 當文件設(shè)置了s參數(shù)時,它將會從這個硬盤空間完全刪除。

u : 與s相反,當使用u來設(shè)置文件時,則數(shù)據(jù)內(nèi)容其實還存在磁盤中,可以用來還原刪除。

四、特殊文件

linux中還有一些特殊的文件,比如鏈接文件和設(shè)備文件。

在處理鏈接文件的時候,我們需要注意判斷鏈接文件的真實指向。

而設(shè)備文件我們需要注意不合理的授權(quán)訪問。

五、java中在共享目錄中使用文件要注意的問題

共享目錄中因為所有人都有操作文件的權(quán)限,所以,我們需要特別注意在java中共享目錄中文件的操作。

根據(jù)java的規(guī)范, java.nio.channels.FileLock可以用來表示文件的鎖定。

通常來講,鎖定有兩種,一種是排他鎖,一種是共享鎖。

共享鎖可防止其他同時運行的程序獲取重疊的排他鎖,但確實允許它們獲取重疊的共享鎖。排他鎖可防止其他程序獲取任一類型的重疊鎖。

共享鎖支持來自多個進程的并發(fā)讀取訪問;獨占鎖支持獨占寫訪問。

但是,加鎖是否真正的阻塞其他程序?qū)υ撐募脑L問,實際是取決于操作系統(tǒng)。

在使用中,我們需要對用戶用戶傳入的文件進行一些必要的校驗,比如是否是常規(guī)文件:

String filename = /* Provided by user */;
Path path = new File(filename).toPath();
try {
  BasicFileAttributes attr = Files.readAttributes(
      path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS);

  // Check
  if (!attr.isRegularFile()) {
    System.out.println("Not a regular file");
    return;
  }
  // Other necessary checks

  // Use
  try (InputStream in = Files.newInputStream(path)) {
    // Read file
  };
} catch (IOException x) {
  // Handle error
}

上面的例子中,我們通過獲取File的屬性,來判斷這個屬性是否regularFile,注意,我們在讀取文件屬性的時候,傳入了一個LinkOption.NOFOLLOW_LINKS,表示的是不要follow鏈接。

雖然我們首先判斷了file的權(quán)限,然后再對其進行操作,但是上面的例子還是會有問題的。因為存在時間差的問題,如果惡意用戶在判斷之后將文件替換成了惡意的鏈接文件,就會出現(xiàn)問題。

六、安全目錄

為了保證用戶的文件操作安全性,我們引入一個安全目錄的概念,所謂安全目錄就是目錄除了用戶本身和超級管理員之外,沒有其他用戶的寫訪問權(quán)限,并且給定文件的父目錄不會被除了系統(tǒng)管理員之外的其他任何用戶刪除或重命名。

在下方的源碼鏈接中,我提供了一個查看安全目錄的class,大家可以自行查看。

本文的代碼:learn-java-base-9-to-20/tree/master/security

以上就是淺談Java安全編碼之文件和共享目錄的安全性的詳細內(nèi)容,更多關(guān)于Java安全編碼 文件和共享目錄的安全性的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中的CurrentHashMap源碼詳解

    Java中的CurrentHashMap源碼詳解

    這篇文章主要介紹了Java中的CurrentHashMap源碼詳解,HashMap是數(shù)組+鏈表構(gòu)成的,JDK1.8之后,加入了紅黑樹,HashMap默認數(shù)組初始化大小為16,如果瞎設(shè)置數(shù)字,它會自動調(diào)整成2的倍數(shù),需要的朋友可以參考下
    2023-12-12
  • Java中統(tǒng)計字符個數(shù)以及反序非相同字符的方法詳解

    Java中統(tǒng)計字符個數(shù)以及反序非相同字符的方法詳解

    本篇文章是對Java中統(tǒng)計字符個數(shù)以及反序非相同字符的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • java方法重寫實例分析

    java方法重寫實例分析

    這篇文章主要介紹了java方法重寫,較為詳細的講述了Java方法重寫的注意事項,并附帶實例加以說明,需要的朋友可以參考下
    2014-09-09
  • Java 操作Properties配置文件詳解

    Java 操作Properties配置文件詳解

    本篇文章主要介紹了Java 操作Properties配置文件詳解,詳細的介紹了Properties和主要方法,有興趣的可以了解下
    2017-05-05
  • Java8?CompletableFuture?異步多線程的實現(xiàn)

    Java8?CompletableFuture?異步多線程的實現(xiàn)

    本文主要介紹了Java8?CompletableFuture?異步多線程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • IDEA使用JDK21控制臺亂碼問題及解決

    IDEA使用JDK21控制臺亂碼問題及解決

    在使用IntelliJ IDEA開發(fā)時,經(jīng)常會遇到因編碼不一致導(dǎo)致的中文亂碼問題,特別是在JDK18以后的版本中,由于JDK內(nèi)部默認編碼格式變?yōu)镚BK,而項目設(shè)置為UTF-8后,會導(dǎo)致亂碼問題,本文介紹了幾個步驟來解決這一問題
    2024-10-10
  • Java編程實現(xiàn)springMVC簡單登錄實例

    Java編程實現(xiàn)springMVC簡單登錄實例

    這篇文章主要介紹了Java編程實現(xiàn)springMVC簡單登錄實例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • java多線程中的異常處理機制簡析

    java多線程中的異常處理機制簡析

    在java多線程程序中,所有線程都不允許拋出未捕獲的checked exception,也就是說各個線程需要自己把自己的checked exception處理掉,需要了解的朋友可以參考下
    2012-11-11
  • Java使用Fastjson進行JSON數(shù)據(jù)操作教程詳解

    Java使用Fastjson進行JSON數(shù)據(jù)操作教程詳解

    Fastjson?是一個?Java?庫,可以用來將?Java?對象轉(zhuǎn)換為它們的?JSON?表示,本文主要為大家詳細介紹了Java如何使用Fastjson進行JSON數(shù)據(jù)操作,需要的可以參考下
    2023-12-12
  • Springboot集成Jasypt實現(xiàn)配置文件加密的方法

    Springboot集成Jasypt實現(xiàn)配置文件加密的方法

    Jasypt是一個java庫,它允許開發(fā)員以最少的努力為他/她的項目添加基本的加密功能,并且不需要對加密工作原理有深入的了解,這篇文章主要介紹了Springboot集成Jasypt實現(xiàn)配置文件加密,需要的朋友可以參考下
    2023-04-04

最新評論

乐陵市| 济阳县| 灵川县| 诸暨市| 遵化市| 昭通市| 镇坪县| 图们市| 轮台县| 无棣县| 共和县| 松原市| 巴南区| 江华| 牡丹江市| 马公市| 栾川县| 手游| 和林格尔县| 榆林市| 新建县| 潮州市| 富顺县| 深水埗区| 东源县| 防城港市| 乃东县| 斗六市| 乐至县| 千阳县| 盐亭县| 青阳县| 阿拉善右旗| 怀宁县| 尚义县| 怀仁县| 依兰县| 砚山县| 天台县| 通海县| 丹东市|