2021/1/10

如何創建一個不可變類別

  • 動機 
    • 在併發的情境裡 , 因為共享記憶體所以每一個線程會複製一份作為工作變數 , 導致資料一致性問題 , 所以當資料確保不可變可以降低併發錯誤率
  • 如何建立不可變物件
    • 所有成員變數必須是private
    • 最好同時用final修飾(非必須)
    • 不提供能夠修改原有物件狀態的方法 , 最常見的方式是不提供setter方法
    • 如果提供修改方法,需要新建立一個物件,並在新建立的物件上進行修改
    • 通過構造器初始化所有成員變數,引用型別的成員變數必須進行深拷貝(deep copy)
    • getter方法不能對外洩露this引用以及成員變數的引用
    • 最好不允許類被繼承(非必須) , 例如Final
  • 淺拷貝與深拷貝

  • 透過反射機制仍然可以改變值

2021/1/8

Spring Boot歷史與特色

  • Spring歷史
    • 1.x : 提供XML設定
    • 2.x : 提供Annotaion設定
    • 3.x : 提供Java Config設定
    • 4.x : 官方建議使用Java Config設定
    • 5.x :  最低支持JDK8、WebFlux響應式編程模型(異步和非阻塞) 、HTTP/2特性支持
      • 響應式編程 : 
        • 非阻塞
        • 函數式編程
        • 回壓
        • lazy load
      • 函數式編程 : 將請求委託給處理函數,這些函數接收一個伺服器請求實例並自動返回Reactive Streams(支持背压Backpressure)的异步数据流处理标准 ,  Mono和Flux這些對象是實現反應式流規範中的Publisher接口的反應式類型,它們的職責是處理數據流。Mono對象處理一個僅含1個元素的流,而Flux表示一個包含N個元素的流。
      • WebFlux模塊為RestTemplate提供了一種非阻塞、反應式的替代方案,名為WebClient。
      • Spring Test現在包含一個WebTestClient,後者支持對Spring WebFlux伺服器端點執行集成測試
  • Spring boot歷史
    • 2.x :  增加之特性
      • 至少需要 JDK 8 支持
      • 響應式編程套件支持
      • HTTP 2.0支持
      • HikariCP資料庫連線池
    • @SpringBootApplication作用在啟動類
      • @SpringBootConfiguration 等价于@Configuration配置檔
      • @EnableAutoConfiguration 从classpath中搜索所有META-INF/spring.factories配置文件,并读取配置
      • @ComponentScan 掃取當前包下的所有Annotation產生Bean
  • Servlet API歷史
    • Servlet是Java EE规范中的定义的一个概念,它是处理用户请求的核心
    • 自Servlet 3.0後,WEB-INF目錄下可以不用加入web.xml , 要做initialize的工作可用下列兩種方式
      • 使用@WebServlet, @WebFilter, @WebListener來標示原有的servlet,filter,listener
      • 實作javax.servlet.ServletContainerInitializer
    • Spring Boot webmvc是通过使用Servlet3.0引入的新接口ServletContainerInitializer来消去web.xml配置文件的。
    • SpringMVC是通過使用WebApplicationInitializer取代web.xml

2021/1/4

OWASP ZAP滲透測試心得

  • 利用手上案子的機會 , 將OWASP ZAP滲透測試心得記錄下來
  • Clickjacking 攻擊 , 參考網址
    • HTTP 標頭 (header) 內之 X-Frame-Options 用來指示文件是否能夠載入 <frame><iframe> 以及 <object>,網站可以利用 X-Frame-Options 來確保本身內容不會遭惡意嵌入道其他網站
    • 共有三種值:
      • DENY 表示文件無論如何都不能被嵌入到 frame 中,即使是自家網站也不行
      • SAMEORIGIN 表示唯有當符合同源政策下,才能被嵌入到 frame 中。
      • ALLOW-FROM <uri> 表示唯有列表許可的 URI 才能嵌入到 frame 中。
    • 最後按照建議選定 SAMEORIGIN
  • Incomplete or No Cache-control , 參考網址
    • HTTP/1.1 標頭 (header) 內之 Cache-control用來特別指令快取如何處理回覆和要求的通用檔頭欄位。使用此欄位和多種的指令,來定義你的快取機制
      • 共有以下幾種值:
        • no-store 表示沒有快取,每次皆重新請求
        • no-cache 表示快取伺服器在把已儲存的複製版本傳給請求者之前,先會送一個請求給網頁伺服器做驗證
        • public 表示指快取伺服器上存的回覆能給好幾個不同的請求者服務
        • private 表示指示快取只給一個使用者使用,且不能被共用的快取伺服器給儲存過。隱私視窗(無痕模式)的快取就可能是這樣子。
        • max-age  表示指存放在快取伺服器上的資源有剩下多少時間被認定還是新鮮的
        • must-revalidate  表示指快取伺服器一定要先發送請求訊息給網頁伺服器驗證,確認是過有效期限且檔案有更新的回覆的話,舊的檔案就不能使用
    • HTTP/1.0 標頭 (header) 內之 Pragma用來設定快取 Pragma: no-cache
    • 最後按照建議 set Cache-Control "no-cache must-revalidate no-store"
    • 最後按照建議 set Pragma "no-cache"
  • 避免瀏覽器誤判文件形態  參考網址
    • HTTP標頭  X-Content-Type-Options , 當瀏覽器收到 X-Content-Type-Options: nosniff;
      就會依照 Content-type 去檢查檔案的 MIME type 是否符合,才會下載並執行此檔案
    • 最後按照建議set X-Content-Type-Options: nosniff
  • HTTP回應透漏伺服器訊息 
    • HTTP標頭 X-Powered-By透露伺服器訊息Servlet/3.0 JSP/2.2
    • 最後按照建議 unset X-Powered-By
  • XSS (Cross Site Scripting)攻擊 , Cross Site Request Forgery(跨站請求偽造)攻擊 參考網址
    • CSRF 就是在不同的 domain 底下卻能夠偽造出「使用者本人發出的 request」。要達成這件事也很簡單,因為瀏覽器的機制,你只要發送 request 給某個網域,就會把關聯的 cookie 一起帶上去。如果使用者是登入狀態,那這個 request 就理所當然包含了他的資訊(例如說 session id),這 request 看起來就像是使用者本人發出的。
    • HTTP標頭 Set-Cookie設定SameSite屬性
    • SameSite 屬性有兩種模式
      • Lax 放寬cookies限制, 例如說<a>, <link rel="prerender">, <form method="GET"> 這些都還是會帶上 cookie。但是 POST 方法 的 form,或是只要是 POST, PUT, DELETE 這些方法,就不會帶上 cookie。
      • Strict 同一個網域才能帶上cookies
    • 最後按照建議edit Set-Cookie ^(.*)$ $1;SameSite=Strict;

test2