博客系统知多少:揭秘那些不为人知的学问(四)
? ?點擊上方關(guān)注“汪宇杰博客” ^_^
上篇《博客系統(tǒng)知多少:揭秘那些不為人知的學(xué)問(三)》介紹了博客協(xié)議或標(biāo)準(zhǔn)。本篇終章介紹設(shè)計博客系統(tǒng)有哪些知識點。
1.“博客”的前世今生
2.我的博客故事
3.誰是博客的受眾?
4. 博客基本功能設(shè)計要點
????4.1 文章(Post)
????4.2 評論(Comment)
????4.3 分類(Category)
????4.4 標(biāo)簽(Tag)
????4.5 歸檔(Archive)
????4.6 頁面(Page)
????4.7 訂閱
????4.8 版本控制
????4.9 主題及個性化
????4.10 用戶及權(quán)限
????4.11 插件
????4.12 圖片及附件的處理
????4.13 敏感過濾及評論審查
????4.14 靜態(tài)化
????4.15 通知系統(tǒng)
5. 博客協(xié)議或標(biāo)準(zhǔn)
????5.1 RSS
????5.2 ATOM
????5.3 OPML
????5.4 APML
????5.5 FOAF
????5.6 BlogML
????5.7 Open Search
????5.8 Pingback
????5.9 Trackback
????5.10 MetaWeblog
????5.11 RSD
????5.12 閱讀器視圖
6. 設(shè)計博客系統(tǒng)有哪些知識點
??? 6.1 時區(qū)真的全用UTC?
????6.2 HTML還是Markdown
????6.3 MVC還是SPA
????6.4 安全
7. 結(jié)束語
6.1 |?時區(qū)真的全用UTC?
存儲時間使用UTC在2020年應(yīng)該已經(jīng)是猿盡皆知的實踐了,博客系統(tǒng)其實也是如此,我的博客所有時間數(shù)據(jù)最終保存都采用UTC時間。但博客有個特殊的地方,即它不應(yīng)該按讀者的時區(qū)去轉(zhuǎn)換UTC時間進(jìn)行顯示,而應(yīng)該按照博客作者的時區(qū)去顯示時間。
這并不是技術(shù)上的原因,就算你按讀者時區(qū)去顯示時間也不會有代碼爆炸,原因在于博客的誕生初衷,就是為了彰顯個性,讓博主在互聯(lián)網(wǎng)上有自己的展示空間,因此突出博主本人的屬性非常重要,博主所在時區(qū)也是個讓讀者了解博主的屬性之一,因此,正宗的博客系統(tǒng)都會給一個時區(qū)設(shè)置選項,并以此轉(zhuǎn)換UTC時間作為顯示,WordPress和我的Moonglade博客系統(tǒng)均是如此。博客系統(tǒng)不自動轉(zhuǎn)換讀者所在時區(qū)的時間,純粹就是個鮮為人知的情懷設(shè)計,但必須得尊重。
(圖:Moonglade 按博主設(shè)置的時區(qū)顯示文章發(fā)表時間)
那么有意思的事情來了,搜索引擎要怎么理解博客文章的時間?最好將UTC時間僅告訴搜索引擎,不要給用戶顯示,方法也很簡單,用HTML5的time標(biāo)簽的datetime屬性即可。在HTML5標(biāo)準(zhǔn)推廣以后,搜索引擎更喜歡看標(biāo)簽類型來判斷內(nèi)容的含義,而不是根據(jù)標(biāo)簽里的內(nèi)容來猜意思。
在C#里,ToString(“u”)指的是Universal sortable date/time patter。
<time datetime="@Model.PostModel.PubDateUtc.ToString("u")" title="GMT @Model.PostModel.PubDateUtc">@DateTimeResolver.GetDateTimeWithUserTZone(Model.PostModel.PubDateUtc).ToString("MM/dd/yyyy")</time>
對于剛才截圖里的文章,時間的HTML為:
<time datetime="2020-04-29 11:41:02Z" title="GMT 4/29/2020 11:41:02 AM">04/29/2020</time>
6.2丨HTML還是Markdown
許多技術(shù)人士編寫博客系統(tǒng)的時候喜歡選用Markdown作為編輯器,如果單純只是個技術(shù)博客,自己使用并沒有什么問題。但如果你在給他人編寫博客系統(tǒng),請記住,不是每個人,都是程序員,不是每個人,都喜歡Markdown。
圖 | 網(wǎng)絡(luò)
在這種情況下,一個WSIWYG的HTML編輯器(如TinyMCE)是不錯的選擇,HTML編輯器相對Markdown也支持更高級的排版方式。Moonglade 同時支持HTML和Markdown編輯器。
(圖:Moonglade 使用的TinyMCE編輯器)
保存文章內(nèi)容到數(shù)據(jù)庫時,Markdown格式需要選擇原始內(nèi)容,而非生成的HTML,因為還需要支持后續(xù)編輯。HTML格式現(xiàn)在也不建議encoding存儲,畢竟都已經(jīng)2020年了,市面上的主流數(shù)據(jù)庫都可以正確支持各種神奇的Unicode,比如文章中突然出現(xiàn)個emoji????,而如果你使用了encoding,就會像我的博客一樣面臨一些福報:https://github.com/EdiWang/Moonglade/issues/280。并且encoding和decoding的過程會影響性能。我的Moonglade博客系統(tǒng)也剛剛完成了去除encoding的改造。
6.3丨MVC還是SPA
許多社區(qū)里寫博客系統(tǒng)的程序員都偏向于使用SPA架構(gòu)建博客,而鄙視用MVC,覺得落后,真的是這樣嗎?這個問題就像是飛機(jī)為什么不飛直線,是航空公司不會規(guī)劃嗎?關(guān)于這一點,我曾經(jīng)在以前的博客文章《我的 .NET Core 博客性能優(yōu)化經(jīng)驗總結(jié)》中寫過:
2014年以后,隨著SPA的興起,Angular等框架逐漸成為了前端開發(fā)的主流。它們解決的問題正是提升前端的響應(yīng)度,讓W(xué)eb應(yīng)用盡量接近本地原生應(yīng)用的體驗。我也面臨過不少朋友的質(zhì)疑:為什么你的博客不用angular寫?是你不擅長嗎?
圖 | 網(wǎng)絡(luò)
其實并不是那么簡單。實際上我任職的崗位的目前主要工作內(nèi)容也是寫angular,博客曾經(jīng)的.NET Framework版的后臺也用過angularjs以及angular2,經(jīng)過一系列的實踐表明,我博客這樣的內(nèi)容站用angular收益并不大。
其實這并不奇怪,在盲目選擇框架之前,我們得注意一個前提條件:SPA框架所針對的,其實是Web應(yīng)用。而應(yīng)用的意思是重交互,即像Azure Portal或Outlook郵箱那樣,目的是把網(wǎng)頁當(dāng)應(yīng)用程來開發(fā),這時候SPA不僅能提升用戶體驗,也能降低開發(fā)成本,何樂而不為?但是博客屬于內(nèi)容為主的網(wǎng)站,不是應(yīng)用,要說應(yīng)用也勉強(qiáng)只能說博客的后臺管理可以是應(yīng)用。博客前臺唯一的交互就是評論、搜索,因此SPA并不適合這樣的工作。這就像你要去菜場買菜,騎自行車反而比你開個坦克過去方便。
在微軟官方文檔里也有同樣的關(guān)于何時選擇SPA,何時選擇傳統(tǒng)網(wǎng)站的參考:
https://docs.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/choose-between-traditional-web-and-single-page-apps?
博客前臺仍然選用MVC的另一個原因,請回顧一下本文開頭“博客的讀者是誰”,我運營博客十余年,統(tǒng)計的數(shù)據(jù)表明,幾乎所有的用戶都來源于搜索引擎,都只點進(jìn)來看一篇文章,然后關(guān)閉網(wǎng)頁?,F(xiàn)在仔細(xì)想想,SPA解決的最大的問題之一是什么?是不是通過只刷新局部來提高前端性能(可響應(yīng)度)?而用戶從搜索引擎過來,只看一篇文章就關(guān)閉網(wǎng)頁,真的用得到SPA只刷新局部的優(yōu)勢嗎?用戶只看一篇文章,你用個SPA框架,用戶得加載一堆框架本身的文件,其中包括導(dǎo)航、交互等功能,而99%的用戶根本就不會點到別的地方去,于是你只為了1%的用戶,去加載碩大的一個框架,值得嗎?這性能到底是提高了,還是降低了?
MVC框架雖然每次都會輸出服務(wù)器端渲染的完整HTML,但由于99%的用戶只看一篇文章就關(guān)閉網(wǎng)頁,所以對于99%的用戶來說,他們所需要加載的資源,遠(yuǎn)小于加載一套SPA,速度更快,還更SEO友好。SPA適合用在博客的后臺管理portal,而不是前臺。
6.4丨安全
根據(jù)運營博客多年的后臺監(jiān)控數(shù)據(jù),最常見的攻擊行為是全自動的漏洞掃描工具。他們會請求例如 data.zip, wp-admin.php, git目錄等常見的安全疏忽,或是想要通過某些博客系統(tǒng)的已知漏洞進(jìn)行攻擊。目的是為了控制服務(wù)器,在你的博客網(wǎng)頁里加入對用戶的惡意代碼(例如勒索病毒、挖礦)等,有些也會將服務(wù)器本身變成礦機(jī)。
(圖:Azure后臺捕獲的自動化掃描工具請求)
設(shè)計博客系統(tǒng)時,常用的安全對策可參考OWASP(https://owasp.org/),但同時保留靈活性。例如,加入JavaScript的CSP時,請考慮正常博客用戶可能需要添加三方統(tǒng)計插件(如Azure Application Insights,國內(nèi)的CNZZ等),請設(shè)計一定的黑、白名單或功能開關(guān)。
大部分設(shè)計者都知道要防范用戶的輸入,即博客的讀者,輸入的入口通常只有評論和搜索功能。但不要忘了,博主在博客后臺管理中的輸入也需要防范,因為不一定是博主本人在操作。舉個例子,博主的賬號被盜,黑客在后臺將導(dǎo)航欄的鏈接指向黑客的服務(wù)器或localhost上早已準(zhǔn)備好的奇妙的機(jī)關(guān)(是的,不要以為localhost在正常人的電腦上不起作用),那么讀者就會受到嚴(yán)重影響。
圖 | 網(wǎng)絡(luò)
關(guān)于后臺登錄的身份認(rèn)證,能采用成熟的SSO的就優(yōu)先采用SSO,例如Moonglade支持Azure Active Directory驗證,這樣能夠利用微軟這樣的專業(yè)服務(wù)管理授權(quán)認(rèn)證,盡可能小的避免賬戶上產(chǎn)生安全問題。如果用戶沒有SSO的環(huán)境,才fallback到本地賬號認(rèn)證。千萬不要認(rèn)為用三方服務(wù)沒自己寫安全,覺得自己寫的邏輯沒人知道就不會被黑了,除非你是世界頂級大牛,不然自己寫的系統(tǒng)易黑程度遠(yuǎn)高于三方服務(wù)。
另有一些攻擊通常由一些敵對陣營的無聊程序員發(fā)起,例如使用腳本或工具持續(xù)不斷的請求博客系統(tǒng)的某個URL,企圖像DDOS那樣擊爆服務(wù)器,對于這種無聊刷刷黨,博客系統(tǒng)設(shè)計者只要加入有關(guān)URL endpoint的rate limit即可。對于真實的DDOS攻擊,只有云端抗DDOS服務(wù)或硬件DDOS防火墻才能解決。
最后別忘了OWASP里沒有的東西,博客的協(xié)議也會有設(shè)計缺陷,例如pingback可以用來DDOS(https://www.imperva.com/blog/wordpress-security-alert-pingback-ddos/),也能掃描服務(wù)器端口(https://www.avsecurity.in/wordpress-xml-rpc-pingback-vulnerability/)
結(jié)束語
設(shè)計一個優(yōu)秀的博客系統(tǒng),每一處細(xì)節(jié)都值得斟酌。這些設(shè)計絕對不可能一開始就能做對,而是得靠長期運營博客的數(shù)據(jù)去發(fā)現(xiàn)并思考。并且,市場會變化,用戶行為會變化,標(biāo)準(zhǔn)會被淘汰,也會被發(fā)明,因此你的系統(tǒng)需要跟著進(jìn)化。
任何看似簡單的系統(tǒng),就算普通到爛大街,也有背后看不見的一套完整體系。博客如此,電子商城、外賣、金融清算系統(tǒng)更是復(fù)雜,不要光憑自己表面看到的就開始做。就如同造飛機(jī),造個紙飛機(jī)和真飛機(jī),絕對不是一回事。
技術(shù)人員也不要覺得什么流行就得用什么,優(yōu)秀的產(chǎn)品并不是堆砌時髦技術(shù)做出來的,而先得分析你的用戶到底是怎么用你的產(chǎn)品,才能做最合適的選擇。要記住,想要一件事情做成功,思路不要只局限于技術(shù)本身,學(xué)會分析市場,用戶行為,才能更準(zhǔn)確的選擇和應(yīng)用技術(shù)。
圖 | 網(wǎng)絡(luò)
感謝讀到這里的讀者,如果大家有什么疑問和討論,歡迎留言交流。
喜歡本篇內(nèi)容請點個在看
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的博客系统知多少:揭秘那些不为人知的学问(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 猎鹰与龙飞船基于Linux,采用C++、
- 下一篇: 记实现TDengine时序数据库支持 .