[Apache] PHP + Apache 環境指南 (libapache-mod-php) on Ubuntu

Intro 雖然Nginx已經…如要架設Apache,可以使用Apache mod PHP去介接PHP(目前Apache不使用PHP-FPM)。 安裝 快速LAMP安裝檔 安裝Apache: $ sudo apt-get install apache2 安裝Apache mod PHP $ sudo apt-get install libapache2-mod-php PHP版本切換 Ubuntu Manpage: a2enmod, a2dismod Ubuntu系列使用Aapche指令工具a2dismod與a2enmod切換,省去修改零散設定檔。基本上版本支援已裝的libapache2-mod-php各版本: $ sudo a2dismod php7.0 $ sudo a2enmod php5.6 Apache MOD PHP 設定要至/etc/php/apache2/ Server執行使用者 Apache的執行使用者的設定檔為/etc/apache2/envvars: […]

[Discuz!] 基本架構與環境建置指南 – Discuz!X系列

Intro 官方目前似乎只介紹到X3.2版本,可以參考Discuz! G雲碼專案或官方論壇,同期已經到x3.4。 PHP 相容 x3.2含以前支援PHP 5.6,不支援PHP 7.2 x3.3支援PHP 7.2 MeriaDB 相容性問題 Discuz!在判斷相容MySQL版本目前是使用單純的字串比較,如install\include\install_function.php內: ($dbver > ‘4.1’ ? ” ENGINE=$type DEFAULT CHARSET=”.DBCHARSET : ” TYPE=$type”); 而$dbver一般皆由各version()函式個別從原生mysql_get_server_info()函式取得,所以MeriaDB可能會回傳如10.1.38-MariaDB-cll-lve,而造成比對後是小於4.1版本。 Install修正 Install部分主要使用install\include\install_mysql.php作為$db全域變數,所以修改: function version() { return ‘5.6’; // 直接指定回傳版本 // return mysql_get_server_info($this->link); } 其他修正 Install完後,論壇的使用上還是會有MySQL語系語法判定錯誤問題,各程式各自有function […]

[HTTP] Content-Disposition 中文解碼支援所有瀏覽器

Intro 非英文語系檔名下載要支援多瀏覽器需要特別處理一下。 目標是達到Google Chrome, FireFox, Edge, IE以及更多的瀏覽器皆能支援。 Content-Disposition – HTTP | MDN 解決方法 使用filename*並遵循RFC 5987編碼標準即可,格式範例: Content-Disposition: attachment; filename=%E4%B8%AD%E6%96%87.txt; filename*=UTF-8”%E4%B8%AD%E6%96%87.txt; PHP sample code: $filename = rawurlencode(‘中文檔名File測試’); header(“Content-Disposition: attachment; filename={$filename}{$extension}; filename*=UTF-8”{$filename}{$extension};”);

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

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

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

[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 )

[PHP] PHP-FPM Pool Socket (Multi-Sock-User) 設定指南

Intro 情境:想要某個Site的PHP-FPM改變執行使用者(例如Webhook trigger特殊程式) 設定方式 概念上,一個pool sock擁有一組設定,包含執行使用者(user)或群組(group),所以可以利用開立多個pool sock來提供給Web server多種PHP-FPM Conf達到應用。 1. 開立新的pool PHP-FPM Pool設定複製原始www.conf出新的自定義設定檔,將listen sock自定義改掉,讓var/run/php下自動產生新定義的socket,例如/etc/php/7.0/fpm/pool.d/deployer.conf: ; pool name (‘www’ here) [deployer] user = deployer group = www-data listen = /run/php/php7.0-fpm_deployer.sock 設定完後restart PHP-FPM即會自動生成對應的新Sock 2. 提供新的Socket給Web server site 以Nginx為例,換上新的Socket: location ~ \.php$ { […]

[Yii2] i18n(Internationalization) – 語系架構設定範例 (使用Key對應架構)

Intro 官網文件:Internationalization 語系代碼:[i18n] 淺談Internationalization – Language Identifiers (RFC 3066) 架構範例 別於官網以主要語系(英文)為sourceLanguage,本章範例以Key的架構去定義語系(也就是Message是指定一個Key必經轉譯)。 Configuration return [ // set target language to be English ‘language’ => ‘en-US’, // set source language to be a customized key which means it will always translate. ‘sourceLanguage’ […]