跳到主要內容

發表文章

SSH Tunnel(Port Forwarding)的應用

自己在管理伺服器和防火牆原則是最小開放原則,一定需要的服務 port 才會開放,例如網頁伺服器的 80、443 等。而管理用的 ssh ,可以的話就限縮來源 IP 範圍,加上限制可以登入的帳號或群組,要不然就改 port 編號;不過,改 port 編號會變成自己在遠端登入時要回想是改成多少,有點不是很方便。 所以最近建置的伺服器就不改 port 了,會加上 fail2ban 的防衛機制。 因為最小開放原則,像是 webmin(10000)這樣的 port 就不會開放,如果想要用的話,就用 ssh tunnel 方式作跳板連接。 例如伺服器的 public ip:123.123.123.123,要連 webmin 的話,就用: ssh 123.123.123.123 -L 10000:127.0.0.1:10000 SSH 登入後就會在客戶端開啟 127.0.0.1:10000 的監聽埠,用瀏覽器連本機的 127.0.0.1:10000 就會跳到伺服器端的 10000 埠。 一直以來,我都以為 ssh -L (Local Port Forwarding)方式只會在本機端綁定 127.0.0.1:xxxx的情形。不過,最近因為要解決一個臨時伺服器的設定問題,才發現原來不是只能綁在 127.0.0.1 上。 網路架構: 外部 public ip:123.123.123.0/24 內部 private ip:10.1.0.0/16 內部切出多個 class C的網路區域,其中 10.1.1.0/24 是 ServerZone,在外面用 DNAT 的方式將服務要求導入內部的伺服器。 其他 10.1.n.0/24 是各個區域內容IP,只能 NAT 出去,外部不能訪問到。 需求: Server-01:10.1.1.2,Server-02:10.1.20.2 Server-01在 ServerZone 內,從外部可以訪問,Server-02 在 PrivateZone 內,外部連不到。ServerZone 和 PrivateZone 彼此可以 SSH 互連。 現在希望可以在不變動兩台 Server 的 IP 區域,讓 Server-02可以被外部訪問到。 最簡單的方式就是先登 Server-01後,再從 Server-01 terminal 登到 Server-02上。但是需求是,...
最近的文章

PHP 輸出 UTF-8 編碼 CSV 檔案

使用 PHP 直接輸出 UTF-8 編碼的 CSV 檔案匯入 EXCEL 會變成亂碼,需要在檔頭加入 BOM 指引碼,EXCEL才會正確讀取內容。 主要是最近寫 CI4 的系統會遇到 composer phpoffice 發生錯誤,所以不能使用 phpoffice 來匯出檔案。查詢了一些資料,用 PHP 直接把資料用 CSV 格式匯出來。 程式片段             $rows = ['學期序',…];              header('Content-type: text/csv; charset=UTF-8');             header('Content-Disposition: attachment; filename=' . $this->nowparam['semestername'] . 'csv');             $output = fopen('php://output', 'w');             fwrite($output, "\xEF\xBB\xBF");             fwrite($output, '"' . implode('","', $rows) . "\"\n");             foreach($data as $tmp){                 fwrite($output, '"' . $tmp['semester'] . '",');                 …             ...

Ubuntu 安裝 Mariadb (新)

參考資料: 如何在 Ubuntu 22.04 上安裝和設定 MariaDB 紀錄安裝 MariaDB的過程及安全設定 1、更新系統 sudo apt update sudo apt upgrade 2、安裝 MariaDB 所需軟體 sudo apt-get install wget software-properties-common dirmngr ca-certificates apt-transport-https -y 安裝主系統 sudo apt install mariadb-server mariadb-client 檢查版本 mariadb --version 檢查伺服器狀態 systemctl status mariadb 3、安全性設定 sudo mysql_secure_installation 4、建立管理員帳戶 GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES;

PhpSpreadsheet 從 Cell 中取值的注意事項

最近在做一個報名系統,需要開放由 Excel 格式報名表上傳報名資料。這項技術之前已有在別的系統上實作過了,是使用 \PhpOffice\PhpSpreadsheet 套件處理上傳的 Excel 檔案,所以把舊的程式套用過來修改即可。 但是在測試的時候,發現部份欄位取值後的資料有問題,一查原來是 Excel 儲存格(Cell)中有設定格式,此時這個儲存格變成 Richtext Cell,在 PhpSpreadsheet 中用 getValue() 取值時,會取出一堆格式的資訊。 在查閱了一些資料後,似乎沒有一個萬用的取值函數,必須要判斷取出的資料是否為 Richtext,若是 Richtext 格式,需要再用 getPlaintext() 函數去把文字內容取出。 如此,在取出每一個儲存格內容後,都有用一個 if 來判斷取出的資料類型後再處理,真的有夠麻煩。還好這次系統要取的欄位沒有很多,萬一未來遇到很多的資料時,一堆 IF 一定會 keyin 在累死,而且程式執行效率也一定會變慢。 有空再來研究看看,有沒有比較省力的方法吧。

手工 PHP CSRF 實作

現在自己寫程式都已經使用 CodeIgniter4 的 PHP 套件,系統會自動使用資安防護機制,如網路表單會使用 CSRF (cross-site request forgery)的機制保護,以防止不合法的資料輸入或程式機器人入侵。 但在之前未使用 CI4 之前的程式,如果要防止相關資訊安全漏洞的話,必要自己手工增加 CSRF 防護。 CSRF 產生: $_SESSION['token'] = md5(uniqid(mt_rand(), true)); 在表單添加 CSRF 隱藏欄位: <input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?? '' ?>"> 在後續程序驗證 CSRF: $token = filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING); if (!$token || $token !== $_SESSION['token']) {     // return 405 http status code     header($_SERVER['SERVER_PROTOCOL'] . ' 405 Method Not Allowed');     exit; } else {     // process the form }

Firebase 認證從 signInWithRedirect 改成 signInWithPopup

 之前有嚐試使用 Firebase 來製作網站的認證程序,最近有收到 Google 的來信,要把原本的認證程式從 signInWithRedirect() 改成 signInWithPopup()。 官方的說明 實作了一下,修改的方式非常簡單,就直接把認證程式改過來就行了。 因為是測試實作,所以先把原本的 signInWithRedirect() 先注解起來,加上 signInWithPopup()就行了。 實際測試運作下,可以正常認證。