分類: 筆記x備忘

  • ionCube 加密/混淆 PHP for Codeigniter4 筆記

    ionCube 加密/混淆 PHP for Codeigniter4 筆記

    前陣子在搞 Android 的混淆,在第三方套件和映射的機制上吃了不少苦頭,最近嘗試把 codeigniter4 做加密,選擇使用 ionCube 套件。這套件並非免費的,pro 版本折合台幣大約 10k 左右,也是不便宜,而選擇他的優點有幾個:

    • 目前最新版尚未有破解、解密的服務。
    • 加密功能選項完整,可設定 ip 限制、網域限制、限制時間等以及外部金鑰檔案等等。參考
    • 可選作混淆功能(不過這樣不會很難 debug 嗎?)
    • 可設定需要加密的檔案,並非直接整個專案加密。
    • 可以設定非 PHP 檔案加密(未嘗試)
    • 可執行 hook 等多種設定,詳細參考官網

    估計他的版本週期是跟著 PHP 版本走的, 所以購買最佳實機應該是在 PHP 出了一個新版本之後再來購買會比較好。

    而他簡單實作的是無框架的 PHP 服務。我針對使用 Codeigniter 4 的框架做了加密動作,以下筆記幾個注意事項:

    1. 可加密的範圍是 app/ 內除了 Config/ 資料夾以外的檔案資料夾。參考圖一
    2. 設定專案時可以把整個專案設定在內,除了可加密範圍之外,其他選擇 copy 動作。
    3. skip 的動作可以是 .DS_Store、 .user.ini 等等或是其他不想要發布的檔案,可充當過濾檔案使用。
    4. 混淆的選項請不要混淆 class 和 method ,弄個不好會有名字對不起來的問題。參考。更建議連 function 也別混淆,呼叫操作很容易對不上的。
      update:解決方法可以參考這裡,不過尚未嘗試。
    5. 如果使用 git 發布的話,要記得考慮清楚原始未加密的程式碼是否也要上 git。
    6. 有部分版本無法加密,參考
    7. 伺服器要能夠安裝 ionCube loader 套件,這滿重要的,不裝起來會無法讀取,如果有設定金鑰的話也需要確認是否可以放置。

    以上。

    圖一。 可加密的檔案範圍。
    圖二。混淆功能選項。
    圖三。截至 2024-03-09 所支援的加密版本。
  • 斜線與反斜線

    斜線與反斜線

    單純整理一下,處理積怨已久分不太清楚的兩個符號。

    斜線的 wiki:

    又稱為斜線號、斜槓、前斜線或正斜線,用作標點符號或其他用途。

    反斜線的 wiki:

    是一種主要用於編寫電腦程式的專門符號。

    辨別方式:

    一、程式語言使用反斜線,標點符號是斜線

    程式語言中,跳脫字元使用反斜線,如果要在正規表達式中打出斜線「/」,需要打「\/」這樣才行,作為轉義字符使用。

    另外還有許多使用場景,參考:

    斜線作為標點符號使用,歷史比較老。雙斜線為古早時期的等號,後來等號躺平了成為現在常看到的「=」。斜線也是作為數學的除法符號使用。在電腦應用上,聊天軟體常用斜線來做命令輸入開頭標示,例如 wordpress 或是 obsidian 中,編輯器輸入命令的開頭,使用的便是斜線。

    其他斜線的使用場景,參考:

    windows 檔案路徑使用反斜線,但是 url 和 mac 的檔案路徑都是使用斜線。

    簡單來說,大部分都是使用斜線的場景,反斜線可以當作影子用途(?)。

    二、外觀差異

    如果以全形表示,斜線為「/」,閱讀順序如果是以左至右的話,斜線為往前傾倒的樣子;反之反斜線:「\」,為往後傾倒的樣子。

    可以簡單記住:「向右轉,前傾是正的,後傾是反的。」呵呵,幼稚園口訣。

    另外可以用中文「八」來記,筆畫第一筆為「丿」,是(正)斜線,第二筆是反斜線。

    三、名稱不同、鍵盤上位置不同

    斜線:slash、斜線、除法運算福、斜槓。

    反斜線: backslash、反斜線、逆除法運算符、反斜槓。

    斜線在標準鍵盤偏下方位置,使用右手小拇指點擊;反斜線在較上方位置,跟「|」符號一起,我的小拇指太短碰不到。

  • WordPress 上 Cookie 的 SameSite 問題

    WordPress 上 Cookie 的 SameSite 問題

    參考這篇問題,主要是描述在支付頁面 retun 支付成功之後,跳回網頁會因為 cookie samesite 的問題導致會員登出,主要解法如同文中所敘述,需要把記錄 user 的 cookie samesite 改成 none,文中也提供了 apache 作法,這邊記錄一下其他作法,基本上都是沒成功的:

    Nginx 於 server 的 Location 中填寫,可能是位置沒填寫正確,沒作用:

    proxy_cookie_path ~^/(.+)$ "/$1;Secure;SameSite='None';Partitioned";

    PHP 有兩種作法,一種是在程式中處理,參考這篇,在 session_start() 之前寫入:

    session_set_cookie_params(['samesite' => 'None']);

    不過他沒理我,在 php.ini 中替換:

    session.cookie_samesite = "None"

    注意 None 是字串,需要雙引號起來。 這個修改會對 session_cookie 起作用。

    不過我的目的是為了修改 wordpress 網站,wp 的 auth cookie 是透過程式寫入的,檢查後也沒反應。鬱悶。

    於是跑進去追了一下程式碼,發現他使用的 setcookie 是 php 7.2 以前的工法,可能是為了向下相容吧,但偏偏在 php7.2 寫入的方式和 php 7.3 不同(參考這裡),但因為 wp core 的寫法,導致無法 hack 從 define 設定的 cookiepath 中直接修改,鬱悶,總不能把網站環境再改回兩蔣統治時期,快樂的 php 7.1 or 7.2 ,這樣挺尷尬的,連 wp 升級都不行。

    後來挖到了這則討論串,看起來 wordpress 他們也正在煩惱。於是在討論串中挖到了一個在 github 上的外掛:

    這個外掛看起來沒啥問題,經過安裝啟用檢查過後,看起來是可行的, auth 相關的 cookie 已經正確顯示 samesite 為 none 了。

    這外掛設定的部分,如同 github 說明一樣,請在後台的「設定」選項中第一個「一般」,點進去以後會發現多一個 uthentication SameSite Cookie parameter 的設定,像是金流跳轉的問題,把他設定為 None 就可以嘍。

    另外得提一下如果 goolge 關鍵字 「wordpress SameSite」 會搜到一款還正在架上間諜外掛,同評論所講的,我也不明白作者為什麼要上架這款外掛,有點坑,而且如果 php 有設定之後,安裝啟用這款外掛還會造成 cookie 錯誤。 此時可以體現測試環境的重要性。

  • Linux 上使用 Monit 做監控

    Linux 上使用 Monit 做監控

    Monit 是一個不錯用的監控軟體,可以實作異常警報或是重啟等動作。網路上有滿多教學的,但是可能是名字的關係,google 時常常找到其他東西。這邊記錄一下。

    有幾個注意點:

    1. M/Monit 是另一款延伸的應用程式,需要付費但有更多功能
    2. 常用的功能:
      • monitrc 設定 stmp 和 alert 。提供警報通道。
      • 設定監控閾值和動作(例如要重啟/開/關或是 alert)
    3. 也有一些延伸功能,例如添加網頁存取,可以透過網頁查看。
    4. 最有需要的應該是 loadavg 和 mem, cpu 的警報。
    5. 有個缺點是無法做 server down/up 的警報。
    6. 重啟指令:monit reload
      • 如果 mail 設定成功,會收到一封重啟通知。
      • monitrc 設定中有 log 位置設定,debian 中預設 /var/log/monit.log 有任何問題可以先看 log

    目前我使用大多作為警報收信,應該是還沒遇到不穩定的系統需要實作自動重啟,算是一種成就??

    這裡貼上一個設定範本 + 說明:

    # 檢察系統效能
    check system $HOST
    
    # 主要設定中 daemon 參數設定 60s,2 cyvles 表示 120s
        if loadavg (5min) > 2 for 2 cycles then alert
        if loadavg (15min) > 2 for 2 cycles then alert
    
    # 有些 server 有 2 顆的 cpu 數字會需要設定超過 100%
        if cpu usage > 190% for 2 cycles then alert
        if memory usage > 85% for 1 cycles then alert
        if swap usage > 30% then alert
    
    # 監控網路行為,要注意 interface 在 server 中是哪個?
    check network public with interface ens4
        if failed link then alert
        if changed link then alert
        if saturation > 90% then alert
        if download > 10 MB/s for 10 cycles then alert
    
    # for 5 times within 30 cycles 意思是: 在 30 個循環裡面出現 5 次(滿足條件)的狀況下
        if upload > 20 MB/s for 5 times within 30 cycles then alert
    
    # 監控硬碟空間的行為, data_directory 是辨識用名稱, PATH 後面的路徑是要監控的路徑
    check filesystem data_directory PATH /data/
        if write rate > 50 MB/s for 5 cycles then alert
        if read rate > 50 MB/s for 5 cycles then alert
    # 因為通常 space 不太會降回去,所以設定的 cycles 數字比較大,相對要特別注意警告
        if space usage > 80% for 60 cycles then alert
    
    check filesystem root_directory PATH /
        if write rate > 50 MB/s for 5 cycles then alert
        if read rate > 50 MB/s for 5 cycles then alert
        if space usage > 80% for 60 cycles then alert

    附上實作顯示網頁的畫面截圖:

    同場加映找到的資源,以後可以少找一些吧。

    基於 centos 環境介紹和教學:

    基於 debian/ubuntu 環境這是介紹和教學(滿詳細的):

    這是延伸的監控服務,要付費的,但是功能更強大:

  • 在 Mac 上使用指令列操作 Android Gradle

    參考 Android Developer 中的文章,我們可以使用 gradlew 指令來操作 Gradle。 Gradle 是 Android Studio 的建構工具,參考這裡

    要注意的部分有:

    1. 在 Android Studio Terminal 中,記得路徑在專案根目錄。執行 ls 會看到 gradlew 指令,就是他!
    2. Windows 系統操作的指令是
      gradlew {{指令}}
      MacOS 是:
      ./gradlew {{指令}}
    3. 最常用的是用
      gradlew assembleDebug 
      他預設會匯出成為
      {{module_name}}/build/outputs/apk/{{module_name}}-debug.apk 
      檔案。 module_name 預設通常都是 “app” 。
    4. 在 MacOS 中,通常產生指令以後還要去找檔案很麻煩,可以在同一個 terminal 中執行 open {{指令路徑}} 指令,可以直接開啟 finder 到指令路徑。
      例如在根目錄編譯好 app-debug.apk 檔案。 輸入:
      open app/build/outputs/apk/debug/
      直接開啟 finder 至 debug/ 目錄。

    另外這裡有較為詳細的說明:

    同場加映 Gradle 的一些操作 tips:

  • 解決 Android Studio 在 Mac 無法輸入中文的問題

    解決 Android Studio 在 Mac 無法輸入中文的問題

    在一次更新 Android Studio 之後發現不能打中文,雖然目前用不上,但是不能打中文註解還是有點嘔阿!再一次下定決心以後決定要來解決這個問題。

    這是目前的安卓版本

    解決方法其實滿簡單的:

    修改鍵盤佈局:在 Android Studio 中選擇「File」>「Settings」>「Keymap」

    Keymap 選一個你喜歡的,記得是 macOS 。

    選好儲存之後,重新開啟專案即可。

    以上,現在可以打中文啦!

    2023-10-23 update:

    keymap 會直接影響到快速鍵,這邊推薦使用 macOS 這個選項,和預設的快速鍵較為不衝突。

  • 記錄一下安卓的 API 版本、名稱、版本代號對應

    記錄一下安卓的 API 版本、名稱、版本代號對應

    — 以下正文—

    開發 Android 有一個小麻煩的地方是 API 版本、名稱和代號的對應,真的是。無論是在 guild 裡面,還是程式碼中,都會遇到需要填寫判斷版本號的問題,偏偏他又有多種格式,連網路上對於版本的稱呼都不太統一。

    於是我找到一個網站,這是給開發人員看的:

    附上網頁翻譯好讀截圖:

    這是網站的 github 原始碼:

  • MacOS 使用 Apache JMester 來做壓力測試

    MacOS 使用 Apache JMester 來做壓力測試

    之前有一篇使用 ApacheBench 來做壓力測試的工具(參考),最近發現一個 GUI 的工具, Mac 和 Windows 都可以用,讚讚。

    照例除了附上操作說明連結,補上自己的注意事項和心得:

    1. 記得要裝 Java 8
    2. 在 MacOS 上,推薦從官網上下載 bin 檔案,用 brew 安裝有點麻煩(我安裝失敗了)
    3. 可以切換繁體中文(從上方 TopBar 點擊 “選項” -> “選擇一種語言” -> “Chinese (Traditional)” ),可是有些專有名詞可能要熟悉一下。
    4. 不得不說,GUI 的缺點就是要點點點,但是不用記住一堆指令,可惜他不是 app 形式製作的,執行檔案要保存好,連結做滿。
    5. 測試模版可以儲存(執行前會詢問),這滿方便的,許多創造一套 API 規則打天下,或是使用 wordpress 這類固定 Web App 的,很適合創建一些模版來用。

    另外補上一些壓力測試要注意的事情,權當壓測前的 check list:

    首先確認測試目標,如果是服務的本身的話,要記得確認流量不會經過服務前方的 CDN 或是防禦工具(e.g. Cloudflare 或是服務商提供的防禦機器)。操作上可以嘗試使用內網、修改 host 指定 IP,或是把防禦工具關閉(例如調整 nginx 或是關閉防火強);而如果是為了要測試防禦工具的話,得先確認是不是要和工具的服務商確認一下,如果是 SaaS 服務,通常會有延伸費用的。

    操作時,務必注意 header 中的操作,像是 token 或是 cookie 驗證,這次簡單測試沒有特別處理,不過通常需要登入的服務都會需要確認調整的。別壓力測試一堆結果都是導向 login 頁面,那就搞笑啦!

    除了內網測試,如果像是 wordpress 這類單體的 web application 外網測試也是需要的,畢竟外網才是正常一般使用者進入的環境。

    補一下程式截圖

    附上連結,這是下載的官網:

    使用 Mac 的安裝說明:

    我們的目標是測試 API ,這是使用說明(使用比較舊的版本,有些操作不太一樣):

    附上 DDos 的防禦策略介紹:

  • 前端 web worker 筆記

    關於前端的 JS 技術還真的是需要筆記的內容。

    這次把 web worker 記錄起來,這是幾年前就有應用的功能,也是一個古老的技術了,意外的其實滿常使用的。

    先重點整理,首先是 Web Worker 的介紹:

    1. 解決 js 單執行緒的工具(web worker 產生 OS 層級的執行緒),避免被放到 event queue 中排隊,參考參考
    2. 解決 js 中 setInterval() 因瀏覽器節流模式嚴重失準,參考
    3. 應用在大量背景運算、長時間的 I/O運作(例如計時器)、避免分頁長時間閒置導致 js 不運作(例如觸發事件時的通知音效)的問題。
    4. 在多核心 cpu 的 Client 端上,使用 web worker 優勢會比較看得出來(通通跑起來)。

    這裡有一篇幾年前製作的 web worker DMEO,實作計時器功能,如果使用 setTimeout() 或是 setInterval() 方法很容易因為各種原因造成時間失准的問題。這裡也有一份 Mozilla 提供的 DMEO。這裡有份教學

    實作上:

    1. Main Script 和 Worker Script 實作 postMessage() 和 worker onmessage 事件拋接資料,參考
    2. 常用有 Dedicated 和 Shared 兩種,差異在 Shared Web Worker 不會因為在同網站中換頁而消失(e.g. 購物車、聊天室..)。
    3. 有一個不太常用的功能 Embedded workers ,主要是利用了HTML5 的 data block 功能,就是想辦法把 web worker 塞在同一個 html 裡面。
    4. Main Thread 和 Worker Thread 彼此之間拋接資料使用參數,該參數是 call by value 的模式。

    需要注意的部分:

    1. Web Worker 和 Service Worker 是不一樣的東西,參考
    2. 雖然機會不高,在技術規劃時先確認使用的網頁載體是否支援相關技術; Android 設備在使用 webview 技術時,也會有遇到處理 webview 碎片化的問題,使用的替代套件要記得確認一下。
    3. 使用 web worker是做背景運算, UI 操作還是要回 UI Thread 上操作,規劃製作時需要注意維護的成本,除了效能之外,也要確認切分後可讀性。
    4. 需要注意耗能的問題,也就是除了網頁載體(瀏覽器/核心)的層面,可能用戶端也需要考慮一下。
    5. 資料拋接時,如果遇到大的物件參數(例如 20+mb 的 Array/JSON ),資源消耗就偏大,參考使用 Transferable Objects 方式來解決,參考參考參考

    附上參考文章。這篇是目前查到最詳盡的介紹:

    我們可以查到 web worker 支援的瀏覽器(唉)有哪些。目前看來主流瀏覽器包含手機都是支援的,有一個特別紅的是 Opera Mini,不過這個應該市佔率不高:

  • Cloudflare 封鎖網路爬蟲

    Cloudflare 封鎖網路爬蟲

    如果你不想要某些網域被網路爬蟲抓到,但是不想更改網站上應用程式的話,除了從 nginx 限制 IP 或是 base-auth 之外,也可以從 cloudfalre 下手。當然前提是你的網域必需要經過 cloudlfare 的邊際網絡。

    這裡介紹可以使用 Cloudfalre 的 WAF 功能。

    進入 WAF 頁面後,點擊建立規則。

    點擊,編輯運算式,輸入以的 user agent 條件。

    (cf.client.bot) 
    or (http.user_agent contains "Googlebot")
    or (http.user_agent contains "Bingbot")
    or (http.user_agent contains "bing")
    or (http.user_agent contains "Slurp")
    or (http.user_agent contains "DuckDuckBot")
    or (http.user_agent contains "Baiduspider")
    or (http.user_agent contains "YandexBot")
    or (http.user_agent contains "sogou")
    or (http.user_agent contains "Spider")
    or (http.user_agent contains "Exabot")
    or (http.user_agent contains "facebot")
    or (http.user_agent contains "PetalBot")
    or (http.user_agent contains "SEMrushBot")
    or (http.user_agent contains "Majestic")
    or (http.user_agent contains "DotBot")
    or (http.user_agent contains "AhrefsBot")
    

    這條件應該還可以再添加,但是規則有總字符數上限。上面列出的是常見的爬蟲包含名稱。同樣的,如果你想要封鎖你不想要的爬蟲名稱也可以再上面設定,不過 Cloudflare 其實有一個「機器人對抗模式」的功能,啟用後他會封鎖壞機器人。 WAF 免費只能有 5 個規則,使用上還是得注意一下喔!

    再來規則就選擇封鎖,然後部署。

    再來用 postman 更改 useragent 測試看看,確認沒問題就行啦!以上。