[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’ […]

[PHP] Yii2 – RBAC原理指南 – Role Based Access Control Guide

Intro Yii RBAC可以整合User Component提供完整的權限控管,官方文件可以參考: Yii2 – Role Based Access Control (RBAC) 概念 RBAC關聯架構 Items分為Role與Module,用Type區分,但皆可直接Assign給User Items裡的Role即為Module的父集合,一個Role可以對多個Modules 一個User可以對多個Items,意即一人可以有多個Role再聯集多個指定Module 在介面概念上,Roles為一區塊可多選,選取或取消將影響Module區塊的Children選項並考慮其他已選Role聯集 RBAC系統架構 User為獨立Component與資料Model,RBAC與之整合 RBAC主要包含assignment(User-items)、items(角色與模組兩種Type)、rules(資料級別規則) RBAC三個Model提供PhpManager(檔案管理)與DbManager(資料庫)載體選擇,皆支援Data Building方法 Data Building提供操作器管理RBAC資料 驗證實作 設定好RBAC後,可以調用yii\web\User::can()做Module驗證判斷。 另外可以搭配ACF做Controller級別驗證,注意ACF中的roles即為RBAC的items: public function behaviors() { return [ ‘access’ => [ ‘class’ => AccessControl::className(), ‘rules’ […]

[Disk] 電腦硬碟原理(MBR/GPT) – Computer Disk Principle

Intro GPT – GUID Partition Table 磁碟分割格式 MBR(512B)與GPT(2048B)為Disk表頭Index,往後才能分割Partition。 磁碟分割區即為該顆磁碟Index,紀錄包含整個磁碟資訊如UUID、Size、Partitions。 透過韌體支援分辨與讀取BIOS/MBR(512B)與UEFI/GPT(2048B)磁碟分割區 Partitions資訊包含start、End、Sector資訊 一般OS啟動時會Cache磁碟分割區,透過Rescan更新 透過Linux dd為理想Byte to Byte對烤工具 大到小Disk copy需捨棄溢位磁區,並對size做矯正,另外UUID會相同,建議修改

[Ubuntu] Ubuntu Desktop Guide – 桌面環境指南

Intro Ubuntu Desktop Grub2 Menu /etc/default/grub: 設為最後一次記憶開機區 # Modify GRUB_DEFAULT=saved # Add GRUB_SAVEDEFAULT=true 指定開機區 # Modify GRUB_DEFAULT=”Windows NT/2000/XP (loader) (on /dev/sda1)” 名稱可從 `grep menuentry /boot/grub/grub.cfg~ 查找 最後Restart: $ sudo update-grub Display Scale $ sudo apt install gnome-tweak-tool $ gnome-tweaks IME […]

[Postfix] SMTP Mail Server 架設教學指南 – Postfix with Ubuntu

Intro 本篇為純送信Mail Server指南,OS環境為Ubuntu 16.04。 Postfix – Ubuntu (Dovecot SASL) 快速安裝檔 安裝 $ sudo apt install postfix 設定 (Interactive) $ sudo dpkg-reconfigure postfix 或者直接對應設定檔:/etc/postfix/main.cf 基本設定完後,就已經完成基本寄信Relay Server,預設無驗證僅採用mynetworks allowed host。 驗證 Postfix需搭配SASL驗證(對應OS系統使用者帳密),預設使用Cyrus SASL、可選用Dovecot SASL,雖然本篇是純粹寄信(SMTP)不做收信(POP3/IMAP)理當用Dovecot有點多餘,但Dovecot SASL整合個人覺得較方便。 Dovecot SASL 整合 1. 安裝Dovecot Core: $ sudo […]

[PHP] 處理二進制資料 – Binary Data Pack/Unpack

Intro PHP支援二進制的資料處理,應用上在跟低階語言(如C語言)做資料介接就幫上許多。 PHP函式 pack() 封裝 Data to BIN unpack 分析 BIN to Data $bin = pack(“Sa3”, 50, ‘abc’); file_put_contents(‘data.bin’, $bin); $bin = file_get_contents(‘data.bin’); $data = unpack(“SShort/a3Char3”, $bin); print_r($data); Array ( [Short] => 50 [Char[3]] => abc )

[JS][jQuery] Events Hooking – 元件觸發事件開發

Intro JS基本的Callback這篇就不多談,現在主要是開發JS元件的Events Pattern。 例如Bootstrap Modal Events Pattern 以jQuery實作,自定義Event Namespace 利用jQuery Event及jQuery Trigger <a>Ancher</a> <!– jQuery required –> <script> $(“a”).click(function(){ alert(‘Click’); var e = $.Event(“namespace”); $(this).trigger(e); // Or directly `$(this).trigger(“namespace”);` }); $(“body”).on(“namespace”, function(){ alert(‘A’) }) $(“body”).on(“namespace”, function(){ alert(‘B’) }) $(“a”).on(“namespace”, function(){ […]