[Network] 網路架構筆記

Intro 網路架構觀念筆記 Concepts 網路(Gateway)不可平行橋接、必有其parent。全球parent root再彼此同步。 網路與網路橋接需要網卡設IP接點,再利用Route Table去轉發路由,以IP分享器接主網路自己做NAT內網為例,主網路可以透過Route Table將IP分享器內網IP/CIDR轉發給IP分享器的主網路IP閘道,一般來說IP分享器會支援轉發滲透內網。 Router 一般來說,WAN埠支援L3、LAN埠僅支援到L2 WAN/LAN埠橋接模式分為路由模式或NAT Modes AP模式即為Get同網一個IP作為自己,並幫助同網繼續switch及配發DHCP。 Repeater(中繼)模式直接L1轉發,並不會Get同網IP,所以裝置也會隱匿於網路中。 AP-Client(ASUS Media Brige)模式可以理解成用WiFi去接AP模式的網路而變成同網Switch,本身不再提供AP模式(類無線橋接)。 Extended reading [Network] 網路 – 封包傳遞原理 – 來源IP與目標IP路由

[Python] Python 3 Guide – 基礎環境指南

Intro Python官網 各平台依照指示下載安裝即可。Windows環境下指令為py。 python / py 依照環境及版本,直接於指令列執行Python程式碼檔案: $ python hellp-world.py $ python3 hellp-world.py $ py hellp-world.py pip Pip為Python套件管理器,可以直接官網下載執行get-pip.py自動安裝,或者套件安裝如APT: $ apt install python-pip $ apt install python3-pip Pip使用範例: $ sudo pip install requests Run Module pip從10版之後改為Module依環境形式啟動,這好處是可以指定由Python版本-m使用相依的pip模組啟動: $ python -m pip install […]

[Web] 後端程式語言指南 – Back-End Application Languages

Intro Programming languages used in most popular websites Web Server進程模型 同步單進程服務器 – QPS=1/每個請求秒數 同步多進程服務器 – QPS=進程數/每個請求秒數 同步單進程多線程服務器 – QPS=線程數/每個請求秒數 同步多進程多線程服務器 – QPS=進程數*每個線程數/每個請求秒數 (Ex. Apache) 同步單進程單線程事件驅動線程池服務器 – QPS依設計決定 (Ex. NodeJS) PHP nginx使用php-fpm介接、或Apcahe使用mod_php Python nginx使用WSGI(多家套件可選)介接、或Apcahe使用mod_python NodeJS Node.js is a single threaded language […]

[Server] Let’s Encrypt with Certbot 指南

Intro Let’s Encrypt – Free SSL/TLS Certificates Certbot – Automatically enable HTTPS on your website with EFF’s Certbot, deploying Let’s Encrypt certificates 近年普遍使用Certbot做Let’s Encrypt憑證申請及自動續約。 快速申請 by Nginx 在單台Web server上使用Certbot快速對已設定的sites做申請,例如:Nginx on Ubuntu 16.04 (xenial) DNS認證申請 (LB佈署架構適用) 考慮Loading Balancing擴充性,如果要多台Nodes同時使用同一個憑證,就會回到單一Node申請佈署至Nodes上,這時使用DNS申請是比較好的選擇。 如不使用DNS Plugins,可以使用手動申請DNS Manual,指令如下: […]

[Yii2][RBAC] 權限項目管理實踐 – Module Items Management

Intro 如果使用Yii2原生RBAC做好多層權限架構管理,例如video類下的program控制器下的create權限,可以讓你在Menu上看到video類跟program控制器選單。 資料結構 3-layer Item Name pattern: {module}.{controller}.{action} 依照上述例子,一個create的權限Item Name應為: video.program.create 那還需要另外兩個權限:video, video.program, 以作為如選單上僅判斷video大類以及video.program選單。 video, video.program,video.program.create三個繼承關係的權限items,並不適合使用Yii2 RBAC中的auth_item_child關係(如透過addChild()建構),因為video不能為最高父層,本身擁有video僅代表至少擁有一個子層,然後auth_item_child架構上有video代表擁有全部子層權限。 所以一個action的權限勢必連帶擁有其父層權限,例如擁有video.program.create items則必須連帶擁有父層: video.program.create video.program video 在管理介面應用上,在下層有選取任一action時往父層繼承(例如選一個action,其controller自動加入權限,再其module自動加入權限) Group結構實現 上述這種需要多層商業邏輯權限,可以使用auth_item中的data欄位做自定義,架構出type及階層關係,在管理介面時就可以透過getItems()取得全部權限items在逐一依照Data做分類資料建構,實現分群。 完成後的資料即可顯示出每個Group下擁有哪些Controllers再以下擁有哪些actions。 在Menu顯示與否的應用上,大分類透過can(‘video’)驗證,再往下如選單透過can(‘video.program’)驗證,action一般控制項在頁面上,就可以再透過can(‘video.program.create’)控制新增按鈕。

[Web] 資料過濾與驗證指南 – Data Validation & Filter (XSS, nl2br)

Intro 防範XSS、SQL Injection以及驗證資料已經是基本開發流程,但要如何標準化的去做團隊開發就是一門學問。 資料驗證 顧名思義,就是在寫入Datebase之前處理Input資料驗證。 以MVC架構來說,Validator最佳的實踐流程點是在Model/Entity上,也就是Model已定義好驗證規則,所以所有經過此Model寫入的資料都會是經過經過規則驗證通過的,提供絕佳的共用性與嚴謹度。 Yii 2 – Validating Input (Yii 2 透過Model定義Validator實踐開發) CodeIgniter/Model – Validation (CI擴充框架中,一樣透過Model定義整合Validator實踐開發) Filter前處理or後處理 以XSS來說,到底要前處理還是後處理? 兩個都沒錯,這全看你後端/資料庫那個欄位到底是定義成Plain Text還是HTML Content。 平均開發上,只要一開始寫資料庫沒特別定義,不外乎都是Plain Text,意即做後處理比較直覺(畢竟過往資料都寫進去了)。 後處理缺點 每次在前端(HTML)顯示時都須謹記後處理,漏一個沒處理就中了廣義XSS 前處理缺點 因為資料預設就是HTML,所以應付前端不須處理;相反的在需要Plain Text(例如Excel Plain Text)時就需要在後處理反轉回來 無法保障資料驗證,因為輸入過濾將影響驗證一致性,例如最大字數通過過濾的不確定性造成不精準 遇到textarea給值時需要Decode回來 (歸類input,正規給值方式value或jQuery val(),用html不標準) 綜合以上,優缺點是一體兩面的,取決於需求。 例如80/20法則,前端顯示開發較多、Plain Text顯示開發較少,那選前處理絕對較省成本,且較嚴謹(畢竟反轉與否不影響安全性),所以依照專案與團隊自行評估即可。 我個人對於Pattern來說會選擇後處理為主,因為儲存資料定義為原始輸入資料(Plain […]

[SQL] 單一連線多資料庫設計模式 – (Multiple Catalogs Databases)

Intro 一個專案會有遇到需要操作多個資料庫的情境,然而多資料庫分離的Type一般分兩類: 同一Application分主資料庫和附屬資料庫,如分myapp與myapp_log兩個DB。 異質系統,若非API串接,也是有可能直接SQL Connection跨過去連線異質資料庫。 異質系統資料庫連線 異質系統連線沒甚麼設計模式,基本上必定需要另外設定一個連線,以PHP Yii2 Framework連線異質MySQL為例: return [ ‘components’ => [ ‘db’ => [ ‘class’ => ‘yii\db\Connection’, ‘dsn’ => ‘mysql:host=localhost;dbname=myapp’, ‘username’ => ‘user’, ‘password’ => ‘pass’, ‘charset’ => ‘utf8’, ], ‘dbOtherApp’ => [ ‘class’ => ‘yii\db\Connection’, ‘dsn’ […]