2018/05/10

SampleCMS 參數過濾元件說明

在 SampleCMS 系統中不管是前台或後台,從 GET (Request.QueryString) 與 POST (Request.Form) 傳送進系統的參數值皆會經過參數過濾機制的檢查,當系統發現參數值有疑似 XSS (Cross-Site Script) 或 SQL Injection 的指令關鍵字就會立刻終止開啟網頁的要求。

參數過濾機制使用參數過濾元件群來檢查各式各樣的規則,
以下說明參數過濾元件的各項功能以及使用方式,

2018/05/08

SampleCMS 附件管理共用元件說明:附件下載共用元件 AttDownloadCommon 使用方式

在 附件管理功能概述 提到了 SampleCMS 附件管理的四項主要功能「儲存(更新)附件資訊與檔案、檢視附件資訊、下載附件檔案、刪除附件檔案」。

上一篇 附件管理共用元件 AttachFileManagerLogic 使用方式 說明附件管理共用元件 AttachFileManagerLogic 在上述功能中「儲存(更新)附件資訊與檔案、檢視附件資訊、刪除附件檔案」負責的工作。

這一篇繼續說明附件下載共用元件 AttDownloadCommon 在「下載附件檔案」負責的工作。

SampleCMS 附件管理共用元件說明:附件管理共用元件 AttachFileManagerLogic 使用方式

上一篇 附件管理功能概述 提到了 SampleCMS 附件管理的四項主要功能「儲存(更新)附件資訊與檔案、檢視附件資訊、下載附件檔案、刪除附件檔案」。

這一篇繼續說明附件管理共用元件 AttachFileManagerLogic 在上述功能中「儲存(更新)附件資訊與檔案、檢視附件資訊、刪除附件檔案」負責的工作。

2018/05/07

SampleCMS 附件管理共用元件說明:附件管理功能概述

附件管理主要由「儲存(更新)附件資訊與檔案、檢視附件資訊、下載附件檔案、刪除附件檔案」這四項功能組成。而 SampleCMS 將檔案資訊與實體檔案分別存放在資料庫與磁碟,在實作程式上因此變得比較繁瑣以及需要較為謹慎,需確保檔案資訊與實體檔案皆儲存完成才算成功。

另一方面,其他的附件管理,例如:照片管理,或是在其他專案曾經製作的廣告橫幅管理商品附件管理。它們在「儲存(更新)附件資訊與檔案、檢視附件資訊、下載附件檔案、刪除附件檔案」這四項功能中的程式流程與這個附件管理是相同的,差別在於可能需要檢查不同的檔案類型、儲存在磁碟的檔名採用不同格式、儲存在磁碟的不同目錄、甚至儲存在資料庫的不同資料表。

而這樣子的差別,不同的類型有著相同的行為但是行為裡的細項動作各自不同,蠻適合使用物件導向來設計共用相同的行為。因此在 SampleCMS 之中,製作了附件管理共用元件 AttachFileManagerLogic 與檔案下載功能的共用元件 AttDownloadCommon。

下列先以循序圖概略描述「儲存(更新)附件資訊與檔案、檢視附件資訊、下載附件檔案、刪除附件檔案」這四項功能,

2018/05/04

[備忘錄分享] XSS (2009 年) 測試記錄

在 2009 年,我第一次接觸弱點掃描,看著掃描報告中的 XSS (Cross-Site Script) 跨網站指令碼漏洞描述,很好奇什麼樣的寫法會用來做為 XSS ,同時也想知道我該怎麼防堵 XSS 進而通過弱點掃描。

當時我找到一個格主是 OpenBlue 的部落格,裡面寫了很多 XSS 相關的知識,我覺得是個寶庫(可惜現在這個部落格已經關了)。我在那個部落格中找到一篇叫做「淺析XSS(Cross Site Script)漏洞原理」的文章,照著文章裡的描述開始了我的摸索與測試。

今日再次搜尋「淺析XSS(Cross Site Script)漏洞原理」才知道原文出處在內地,還好這篇文章還看得到,請看 http://safe.it168.com/n/2007-07-04/20070704004201_all.shtml

以下為當時我所記錄的內容,

[備忘錄分享] 簡介曾經做過的 Smart Client 架構

大約是 2006 年,那時的我從使用 C++ 寫遊戲程式轉換到使用 .net 寫視窗與網頁程式。
當時的工作是我從資策會學完 .net 之後的下一份工作。工作的內容是和公司的前輩一起製作一個電視購物的 ERP (Enterprise Resource Planning) 系統,主要的子系統如下,
  1. 提供給電話客服人員使用的訂單系統。
  2. 提供給物流人員使用的進銷存系統。
當時希望採用微軟在 2004 年提出的 Smart Client 架構,這個架構簡單的來說就是要取 Window Form 程式與 ASP.NET 網頁程式的優點並且捨棄它們的缺點。

傳統的 Window Form 程式,定位為 Rich Client (又叫 Fat Client, Thick Client),
相較於當時的網頁程式,Window Form 能夠使用更豐富的 UI 元件提供給使用者互動,但是缺點就是不易更新使用者手上的程式,每次的程式更新都得打包安裝檔並且讓每個使用者下載與安裝,不像網頁程式用瀏覽器只要重新打開原本的連結,網頁內容隨時都是最新版本。這個問題在使用者越多時會越令人頭痛。

網頁程式,定位為 Thin Client,
不像現在 2018 年,當時的網頁程式連 ajax 都還沒流行,網頁程式能提供給使用者的 UI 都很陽春,和視窗程式有很大的落差。不過其優點就像上一條提到的,發佈更新很方便,只要重新打開原本的連結,網頁內容隨時都是最新版本。

而 Smart Client 就是要取上述兩種的優點,要有 Window Form 程式的豐富 UI ,而且發佈更新像網頁程式一樣方便。

以下簡介當時製作的 Smart Client 系統架構,

2018/05/03

SampleCMS 前台網頁預覽功能驗證方式說明

SampleCMS 後台管理功能「網站架構管理」提供預覽尚未開放的前台網頁內容功能。
使用的方式如同操作手冊「3.1.使用情境:檢視指定網頁資料」提到的,
"若指定的網頁資料狀態是隱藏的或者不在上架期間,則檢視鈕會變更為預覽鈕,此時點選指定語系的預覽鈕,系統將以預覽模式開啟未開放的前台網頁,並且在前台網頁中出現「您正使用預覽模式檢視本頁」的提醒訊息

* 基於保密的原則,每一次用來預覽指定的前台網頁網址有時效限制,目前為10分鐘,當預覽用的網址產生超過10分鐘且繼續被用來開啟網頁時將導向錯誤頁,此時若還需要預覽指定的前台網頁,請回到網頁管理畫面點選預覽鈕重新產生。"

以下說明前台網頁預覽功能驗證方式,

SampleCMS 網頁共用元件說明:前台相關元件分工說明

在說明完 後台相關元件分工說明 之後,繼續說明前台相關元件。
接下來以通用的多功能網頁程式 Article.aspx 為例說明前台相關元件以及各項的分工,包含 網頁共用元件說明:簡介 提到的前台網頁共用元件 FrontendPageCommon。

2018/05/01

SampleCMS 網頁共用元件說明:後台相關元件分工說明

製作網頁程式的時候,除了至今為止談過的資料層元件帳號與權限系統元件網頁內容發佈系統元件網頁共用元件這些屬於資料層與邏輯層的共用元件,展示層也有需要共用的部分。以後台網頁為例,每一個清單頁都有下列元素「 Logo 圖、登入資訊、右上角使用者選單、左側系統功能選單」。

使用 ASP.NET Web Forms 製作網頁,常用來製作展示層共用元件的方式就是使用 MasterPage 與 UserControl。SampleCMS 也不例外,接下來以帳號清單頁 Account-List.aspx 為例說明後台相關元件以及各項的分工,包含前一篇 網頁共用元件說明:簡介 提到的後台網頁共用元件 BackendPageCommon(在帳號清單頁使用的是其衍生類別 AccountCommonOfBackend)。

2018/04/27

SampleCMS 網頁共用元件說明:簡介

在製作 ASP.NET Web Forms 網頁程式時,如果遇到多個網頁程式都會寫到的重覆功能,常用的做法就是將這項目功能從這些網頁程式中抽出並且放在一個共用的父類別 BasePage 之中,讓所有網頁程式都繼承自 BasePage,共用 BasePage 裡面的功能。

以我的例子來說,我喜歡把四散在網站中所有網頁程式裡的 Request.QueryString["Id"], Request.QueryString["name"] 包裝成屬性 int qsId, string qsName。
(另外,Session["Param"] 和 ViewState["Param"] 也是)

會這麼做的起因是為了弱點掃描,當初為了要針對 QueryString 參數值撰寫白名單機制,在統計 Request.QueryString["xxx"] 全部有多少參數名稱、各是什麼樣的類型的時候,覺得四散在程式裡的相同參數名稱太多,而且 QueryString[] 很自由的讓參數名稱不用區分大小寫導致同名參數有不同的大小寫在不同的地方,覺得維護時不好讀。

2018/04/25

SampleCMS 網頁內容發佈系統元件說明:元件提供的功能與使用方式

網頁內容發佈系統為 SampleCMS 內部的兩大子系統之一(另一個為帳號與權限系統),在系統設計說明開頭 前言 內文提到的 SampleCMS 主要提供的功能 之中,除了帳號與權限管理,其他功能都屬於這個子系統。

本篇說明系統邏輯層中的網頁內容發佈元件所提供的功能,以及呼叫者端(展示層的網頁程式)如何使用這個元件。

2018/04/24

SampleCMS 帳號與權限系統元件說明:客製化權限判斷

接續上一篇 元件提供的功能與使用方式 結尾提到的,(帳號設定頁)"使用的方法 CanEditThisPage() 之所以不用傳入擁有者資訊是因為管理頁共用元件實作了介面 ICustomEmployeeAuthorizationResult,透過實作的介面方法 InitialAuthorizationResult(bool isTopPageOfOperation, EmployeeAuthorizations authorizations) 將擁有者資訊交給了帳號與權限元件",本篇繼續說明介面 ICustomEmployeeAuthorizationResult 的作用以及需負責的工作。

2018/04/20

SampleCMS 帳號與權限系統元件說明:元件提供的功能與使用方式

上一篇 帳號與權限規則說明 提到了授權範圍的定義以及後台網頁程式如何達成權限判斷,而系統邏輯層中的帳號與權限元件就是依照帳號與權限規則設計。

接下來繼續說明帳號與權限元件所提供的功能,以及呼叫者端(展示層的網頁程式)如何使用這個元件。

2018/04/19

SampleCMS 帳號與權限系統元件說明:帳號與權限規則說明

SampleCMS 帳號與權限系統的設計以員工身份(以下簡稱身份)為主軸,帳號登入後台之後能夠使用後台左側選單中的哪些作業選項取決於帳號屬於哪一個身份,管理者需事先設定身份能否使用以及怎麼使用系統中的作業選項
*作業選項有哪些?例如「帳號管理、身分權限管理、後端操作記錄、網站架構管理...等」。

以下說明授權給身分使用的範圍定義,

2018/04/17

SampleCMS 資料層元件說明:客製化指令資訊類別 (DataAccessCommandInfo)

前一篇提到如何透過四個步驟來建立資料層中用來存取指定 Stored Procedure(以下簡稱 SP)的指令資訊類別 (DataAccessCommandInfo) 。

接下來要繼續說明如何客製化指令資訊類別,例如:我想直接在資料層寫 sql script、我想在資料層開啟交易執行多個 SP。

2018/04/14

SampleCMS 資料層元件說明:依照 Stored Procedure 建立基本的指令資訊類別 (DataAccessCommandInfo)

寫程式的過程中,我對於需要大量重覆編寫相同格式的程式碼難免會覺得枯燥乏味,例如在撰寫資料庫存取功能,已經花時間在資料庫寫好了取得員工資料的 Stored Procedure(以下簡稱 SP),接著還要再去資料層函式庫又寫一個取得員工資料的類別,寫的內容就像是換個格式重寫一樣的 SP 名稱與參數名單,難免覺得浪費了更多時間。

個人覺得寫程式最快的方式就是「複製、貼上、修改」,但前題是複製的來源程式碼最好是整理過的,不然很可能變成 -複製混亂、貼上混亂、修改更混亂-,造成後續維護的麻煩。

針對指令資訊類別 (DataAccessCommandInfo),我把開發過程中自己常用的格式整理成一份 DemoCommandInfos.cs (放在資料層函式庫的 namespace Common.DataAccess.DemoCommandInfos,只是方便自己需要時隨時打開來用),
以下說明,

2018/04/13

SampleCMS 資料層元件說明:指令執行者 DataAccessCommand 運作方式說明

前一篇提到"將指令資訊物件 (cmdInfo) 丟給指令執行者 (cmd) 去執行取回填入資料的 DataSet,執行過程中指令執行者 (cmd) 會自動抓取指令資訊物件 (cmdInfo) 的成員變數,依照成員變數的名稱,將其值傳送給 SP 的同名參數",現在我們一起來看看指令執行者是如何依照指令資訊物件的描述去資料庫執行 Stored Procedure(以下簡稱 SP)。

2018/04/12

SampleCMS 資料層元件說明:基本的呼叫方式

SampleCMS 的資料存取幾乎都是透過事先寫好的 Stored Procedure(以下簡稱 SP)。
(讀取資料用的 SP 名稱為 dbo.spTableName_GetData 或是 dbo.spTableName_GetList、
 新增用的 SP 名稱為 dbo.spTableName_InsertData、
 更新用的 SP 名稱為 dbo.spTableName_UpdateData、
 刪除用的 SP 名稱為 dbo.spTableName_DeleteData)
因此本系統的資料層元件是以執行 SP 做為主軸來設計,
以下說明基本的呼叫方式,

SampleCMS 系統資料表說明

SampleCMS 系統資料表,以功能區分為兩大類,「帳號與權限系統」與「網頁內容發佈系統」。
以下說明,

SampleCMS 系統組件關聯圖

SampleCMS 內容管理系統為三層式架構設計,以功能區分為兩大類,「帳號與權限系統」與「網頁內容發佈系統」。

下圖為系統組件關聯圖,以下說明:

SampleCMS 系統設計說明:前言

SampleCMS 是一個基本款內容管理系統 (DemoSource),是我在最近7年工作的過程中將各個前輩留下來的內容管理系統整理、歸納、簡化與重新設計後的結果。在此感謝先得利資訊讓我進入製作內容管理系統的領域,讓我能夠看到以及參與製作各式的內容管理系統;感謝叡揚資訊讓我有機會接觸與學習不同的系統架構設計方式,增加了我在物件導向程式設計的經驗。

回題,
SampleCMS 主要提供的功能如下:

SampleCMS 系統設計說明:目錄

1. 前言
2. 系統組件關聯圖
3. 系統資料表說明
4. 資料層元件說明
4-1. 基本的呼叫方式
4-2. 指令執行者 DataAccessCommand 運作方式說明
4-3. 依照 Stored Procedure 建立基本的指令資訊類別 (DataAccessCommandInfo)
4-4. 客製化指令資訊類別 (DataAccessCommandInfo)
5. 帳號與權限系統元件說明
5-1. 帳號與權限規則說明
5-2. 元件提供的功能與使用方式
5-3. 客製化權限判斷
6. 網頁內容發佈系統元件說明
6-1. 元件提供的功能與使用方式
6-2. 自訂帳號授權結果
7. 網頁共用元件說明
7-1. 簡介
7-2. 後台相關元件分工說明
7-3. 前台相關元件分工說明
8. 前台網頁預覽功能驗證方式說明
9. 附件管理共用元件說明
9-1. 附件管理功能概述
9-2. 附件管理共用元件 AttachFileManagerLogic 使用方式
9-3. 附件下載共用元件 AttDownloadCommon 使用方式
10. 參數過濾元件說明


2018/03/06

個人作品:把 SampleCMS 資料層改寫為使用 Entity Framework 6 的另一個網站 SampleEFCMS (2018-03-24 更新)

說起來,在 2011 年左右,我對 Entity Framework 就很好奇,只是當時工作上沒機會接觸,下班後所剩的時間也不多,都先花在更需要用在工作的其他技術上。7 年後的現在,趁著待業中的這段空閒時期,趁著剛完成 SampleCMS 的這股衝勁,終於開始真正的去學習與使用 Entity Framework (Database First)。

SampleCMS 資料層是以 Stored Procedure(以下簡稱 SP) 為基礎,算一下大大小小共寫了 105 個 SP,單純的複雜的都有。SampleEFCMS 將其中的 103 個都改為用 LINQ to Entities 的方式達成相同功能。幸運的是,比較進階的坑有踩到幾個(e.g., OrderBy 的欄位名稱需要用字串動態更換、where 的 or 條件需要動態串接),卡關的同時也在網路上找到高手寫的 LINQ 擴充函式,覺得不虛此行。

以下為 SampleEFCMS 相關連結:


2018/02/02

個人作品:基本款內容管理系統 SampleCMS 開放測試網 (2018-05-15 更新)

上篇
距離上次曬完圖又過了兩個星期,我在這個系統加上了針對弱點掃描軟體所做的參數過濾機制,後台登入頁加了 "變更密碼、忘記密碼",另外也對前台做了初步的壓力測試並調整不足的地方。最後加入 guest 試用帳號相關功能並且試著把系統放上 Azure,目前結果看來還算可以,以下放上相關連結: