CVE-2021-44228 Issue


平常滑FB大多是看看程式社群的情報內容,但沒一次燒到自己身上,沒想到這次這麼特別燒到log4j2上
於是就想來看看發生甚麼事情了

1. 先找官方說明看看

CVE-2021-44228

logging.apache

問題描述:
Apache Log4j2 <=2.14.1 JNDI features used in configuration, log messages, and parameters do not protect against attacker controlled LDAP and other JNDI related endpoints. An attacker who can control log messages or log message parameters can execute arbitrary code loaded from LDAP servers when message lookup substitution is enabled. From log4j 2.15.0, this behavior has been disabled by default. In previous releases (>2.10) this behavior can be mitigated by setting system property “log4j2.formatMsgNoLookups” to “true” or by removing the JndiLookup class from the classpath (example: zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class). Java 8u121 (see https://www.oracle.com/java/technologies/javase/8u121-relnotes.html) protects against remote code execution by defaulting “com.sun.jndi.rmi.object.trustURLCodebase” and “com.sun.jndi.cosnaming.object.trustURLCodebase” to “false”.

1
Apache Log4j2 <=2.14.1 在配置、log訊息和參數中使用的JNDI功能不能防止攻擊者控制的LDAP和其他JNDI相關端點。攻擊者如果能控制日志信息或日志信息參數,在啟用信息查找替換功能時,可以執行從LDAP服務器加載的任意代碼。從log4j 2.15.0開始,這種行為已經被默認禁用。在以前的版本(>2.10),這種行為可以通過設置系統屬性 "log4j2.formatMsgNoLookups "為&#8220;true&#8221;或從classpath中刪除JndiLookup類(例如:zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class)而得到緩解。Java 8u121(見https://www.oracle.com/java/technologies/javase/8u121-relnotes.html)通過將 "com.sun.jndi.rmi.object.trustURLCodebase "和 "com.sun.jndi.cosnaming.object.trustURLCodebase "默認為 "false "來防止遠程代碼執行。
閱讀全文 »

於ubuntu 18.04 mysql 8.0 移除
sql_mode 中的 only_full_group_by


某天在開發isthereanyclothes這個專案時在DBeaver上先寫Query看看沒想到跑出

SQL Error [1055] [42000]: Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column '' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

SELECT 列表中的第二個表達式不在 GROUP BY 的子句中,同時它也不是聚合函數;這與 sql 模式:ONLY_FULL_GROUP_BY 不相容。

sql_mode=only_full_group_by

  1. 先找官方說明看看

5.1.10 Server SQL Modes 其中提到了

ONLY_FULL_GROUP_BY Reject queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are neither named in the GROUP BY clause nor are functionally dependent on (uniquely determined by) GROUP BY columns.

ONLY_FULL_GROUP_BY
如果Queries中 SELECT 中的列、HAVING 語句或者ORDER BY子句的列,沒有在GROUP BY子句中命名的非聚合列出現而且也非功能上的依賴GROUP BY列,那麼這個SQL是不合法

ONLY_FULL_GROUP_BY是MySQL提供的一個sql_mode,通過這個sql_mode來提供SQL語句GROUP BY合法性的檢查,在MySQL的sql_mode是非ONLY_FULL_GROUP_BY語義時。
所以語法上比較嚴謹

基於對於SQL的掌握的還沒有很熟悉,我決定先拿掉ONLY_FULL_GROUP_BY來方便的開發如果今後有相對的影響會再想文章,權衡比較

閱讀全文 »

Fix PyMysql Update Fail


某天在調整我的爬蟲時發現到 下的Update Query都沒有成立
檢查欄位的updated_at 也沒有更新到於是開始反查原因

  1. 先print出PyMysql的Row Sql來看
    connection = pymysql.connect(
    host=db_host,
    database=db_name,
    user=db_user_name,
    password=db_password
    )
    cursor = connection.cursor()   
    update_sql = """
    UPDATE product
    SET name= %s
    """
    data = (prod_name)
    cursor.execute(update_sql, clothes_data)
    print(cursor._last_executed)
    
    cursor is the object used to interact with the database
    cursor._last_executed 為這個物件最後executed的query

OK 我檢查 Query 是正確的 但還是沒有更新到

閱讀全文 »

前言

翻譯來源


Facebook使用了一個大型的MySQL分段式設置,既用於生成id值,也用於存儲實際數據本身(所以它不是一個獨立的系統)。

每個分段都會從64位元的範圍中得到非常大的一塊id值。然後,它使用一個auto_increment MySQL欄位和一些簡單的數學計算,計算出分配給分段的id範圍內的新值。

例如,你可以給分段 #1分配一個0到1億的範圍。shard #2可以是1億到2億,等等。然後,每個都可以相互獨立地分配新的唯一id。

由於我們處理的是64位的整數,你可以為每一個做非常大的範圍,並且仍然有非常多的分段。

每個分段都會跟蹤生成的id值,以及與之相關聯的數據類型,所以給定一個完全未知的id,你可以計算出它。

起因

某一天朋友傳給我了一張強國論壇的身分證字號分析
我就心想強國都知道我國身分證的編碼方式了
我怎麼能不知道呢,於是我去找了很多資料整理如下

身分證字號的意義

目前的中華民國身分證字號一共有十碼,包括起首一個大寫的英文字母與接續的九個阿拉伯數字。其中首碼英文代碼是以初次登記的戶籍地來區分的,而首位數字則是拿來區分性別,男性為1、女性為2,與ISO 5218以及類似的《中華民國國家標準》CNS 8381《資訊交換-人類性別表示法》的用法相同。

身分證字號首碼英文代碼的對照表如下:

閱讀全文 »

起因

在進行公司專案開發時,有使用到LINE Login v2.1的oauth2,在導到callback URL後會在service層打line的
oauth2,但每次登入失敗,log紀錄後看到

1
2
3
4
[2021-03-26 09:34:51] local.ERROR: Line Login Error, JWT decode error
Cannot handle token prior to 2021-03-26T09:34:53+0800

[2021-03-26 09:36:35] local.ERROR: payload->iat = 1616722597 and time() = 1616722595 leeway= 0

payload->iat 是ID token 產生的時間 (UNIX 時間)
time() 是本機產生的時間 (UNIX 時間)
在v5.2.0中的JWT.php中寫道

1
2
3
4
5
6
7
8
// Check that this token has been created before 'now'. This prevents
// using tokens that have been created for later use (and haven't
// correctly used the nbf claim).
if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) {
throw new BeforeValidException(
'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->iat)
);
}

其中他檢查$payload->iat 是否存在以及 $payload->iat的時間是否小於業務系統端的時間
依據上面的數據顯示payload->iat = 1616722597 是大於 time() = 1616722595
而產生此Error
看下來原來是api伺服器的時間與業務系統所在的機器時間有些小偏差所致。

解決方法

閱讀全文 »

前言

身為一個菜鳥的工程師免不了都對於GOOLE的開發及測試作法感到有興趣,在line社群中意外的得知了這本書就從海鮮拍賣上拉了古書翻譯本下來

Chapter 1 - gooole 測試軟體介紹

  1. goole是一間奠基在創新與速度上的公司,在這樣的環境下進行的測試比須非常敏捷,有時邊開發邊寫測試會讓兩者交織,有時測試根本就是獨立進行
  2. 測試不會造成摩擦而會讓創新與開發的速度慢下來
  3. 別雇用太多的測試者(品質是開發者需要去維護的)
  4. goole重視品質勝過功能
  5. 測試必須是開發過程中不可被忽略的面向,而開發與測試的融合就可以達到品質的要求
  6. 組織分工
  • SWE(software engineer)
    1. 建立設計文件
    2. 設計架構
    3. 撰寫TDD與單元測試
  • SET(software engineer in test)
    1. 以開發者角色
    2. 檢視設計且特別注意程式品質與風險
    3. 編寫單元測試框架與自動化
  • TE(Test Engineer)
    1. 以使用者角度
    2. 撰寫自動化腳本的程式碼,模擬使用者情境的程式碼
    3. 組織整體品質實作
    4. 解釋測試結果
  1. goole是通常會製作出”最小可用產品”
  2. goole使用小,中,大測試來替代程式碼、整合與系統測試,用意是強調範圍比形式更加重要
閱讀全文 »

前言

在我自己在linode vps憑證時的紀錄

舊的配置方式(已棄用) base on python 2

新的配置方式 base on python 3

甚麼是Certbot?

Certbot是一種工具,可以自動執行通過Let’s Encrypt獲取簽名證書並與TLS一起使用。

對於大多數操作系統和Web伺服器配置,Certbot會創建簽名證書,管理Web伺服器以接受安全連接,並可以自動續訂已創建的證書。 在大多數情況下,Certbot可以無縫啟用HTTPS,而不會導致服務器停機。

在開始之前

確保您已經註冊了完全合格的域名(FQDN),並設置了指向您的Linode的公共IPv4和IPv6地址的A和AAAA DNS記錄。 請查閱我們的DNS記錄:簡介和DNS管理器指南,以獲取有關設置域的幫助。

閱讀全文 »

前言

翻譯來源
翻譯來源
隨著社交媒體和用戶生成的內容爆炸式的增長,網際網路一直在變好。為了跟上這些變化的步伐,並提供更多的互動性,開發者開始構建函式庫和框架,使得建立互動式網站更加的容易。2006年,John Resig发布了jQuery,使得在HTML中編寫客戶端語言變得更加容易。隨著時間的推移,其他類似的專案出現了。剛開始,這些專案是大型、單一的此外他們還把自己的願景強加給開發者。而到了現在,已經轉向為開發緊湊、輕量級且非常容易添加到任何應用的函式庫。讓我們來看看其中最流行的三個。

JavaScript框架概述

開始一個新專案總是要做決定。其中一個關鍵的就是選擇合適的框架或函式庫。幸運的是,Vue.js是一個非常通用的庫,可以處理各種任務。

Vue.js

Vue.js是一個函式庫,它允許你在任何使用JavaScript的編碼環境中注入交互性和附加功能。Vue既可以用於單獨的頁面,解決簡單的任務,也可以作為完善的工業應用基礎。Vue.js是一個用於構建圖形用戶界面的進階框架。當與現代工具和附加函式庫結合使用時,它也適合構建覆雜的單向應用程式。
Vue函式庫最大的優勢之一是它不需要任何特殊的知識。任何Vue的應用程式都是使用HTML、CSS和JavaScript所編寫的–熟悉所有工具讓你可以立即投入工作。即使你以前從未做過客戶端開發,你也可以隨時利用以前的經驗,使用MVC設計模式,這與MVVM非常相似。

閱讀全文 »

Fix Laravel 8 中出現 Target class controller does not exist


今天在練習Laravel 8時,照往常在api.php設定了Route沒想想到終端報了以下錯誤

Illuminate\Contracts\Container\BindingResolutionException Target class [AuthController] does not exist

我看了一下

Route::get(‘register’, ‘AuthController@register’);

沒有寫錯啊,直到我去查stack over flow才知道改了預設的寫法

官方網站上也有實作上的差異
Laravel 8.x Basic Routing

Laravel 7.x Basic Routing

閱讀全文 »