跳到主要內容

發表文章

異體字與歷史,少一點的「平頭憲」

在閱讀古籍時,我們常常會仰賴前人的權威注釋。但有時候,跨越時代的語境差異,反而會讓後代的大學者也產生「望文生義」的誤解。 最近在翻閱《資治通鑑》時,注意到一段關於南齊名臣王儉諡號之爭的有趣記載,而元初學者胡三省對其中「平頭憲」三個字的注釋,似乎大有可疑之處。 史料背景:一場「同音字」的政治角力 這段故事發生在南齊武帝永明七年(西元 489 年)。當時權傾一時的南昌文憲公王儉過世,朝廷要為他定諡號: 禮官欲依王導,諡儉爲文獻。晏啓上曰︰「導乃得此諡;但宋氏以來,不加異姓。」出,謂親人曰︰「『平頭憲』事已行矣。」〈平頭,謂王字也。諡,神至翻。〉——《資治通鑒/卷136》 簡單來說,禮官本來提議用極高規格的「文獻」作為王儉的諡號(仿效東晉名相王導)。但政敵王晏跳出來反對,認為王儉不配。最終,王晏成功狙擊,將王儉的諡號降級為同音的「文憲」。 王晏走出朝堂後,得意洋洋地對親信炫耀:「『平頭憲』事已行矣。」意思是這件事已經按照他的意思定案了。 權威的誤解:胡三省的「拆字猜謎」 這句話的精髓在於「平頭」二字。權威注釋家胡三省在這裡加了一條註解: 「平頭,謂王字也。」 胡三省的邏輯不難推測:他將這視為一種拆字謎。「王」字的第一筆是一橫,頂部平坦,所以「平頭」指的就是王儉的姓氏「王」。按照他的解釋,王晏的話就變成了:「『王』家的『憲』字諡號已經定案了。」 但這個解釋在語境上非常突兀。王晏與王儉的衝突核心在於「獻」與「憲」兩個字的替換,王晏向親信炫耀的是他在這場「文字遊戲」中的勝利,如果單純指稱「王家」,不僅毫無嘲諷的力道,也完全偏離了替換諡號的得意之情。 從「異體字」還原歷史現場 如果「平頭」不是指「王」字,那到底是指什麼?答案就藏在魏晉南北朝的「異體俗字」裡。 在當時,口語中為了區分讀音相同或相近的字,常常會用描述字形特徵的方式來表達。我們來對比一下這兩個字: 獻:左半邊是「鬳」,右半邊是「犬」,字形頂部參差不齊。 憲:正字上方是「宀」。但在六朝的書寫習慣中,「憲」字最上方的「點」經常被省略,寫成了「冖」(此異體寫法可見於教育部《異體字字典》字號 A01442)。 因為這個異體字的最上面是一條平滑的橫線,所以當時的人便俗稱這個字為「平頭憲」。 小結:被忽略的六朝語境 理解了這層字形上的差異,王晏那句「『平頭憲』事已行矣」的生動畫面就完全躍然紙上了。他不是在講什麼「王家的憲」,而是指...
最近的文章

PostgreSQL的全文搜尋插件

PostgreSQL實在是包山包海,最近發現竟然有支援中文全文搜尋的套件PGroonga,以下簡單介紹一下。 開頭 PostgreSQL原生就有to_tsvector可以處理英文的全文搜尋,包含刪除停止詞、詞性還原等,做英文的全文搜尋很夠用了,但to_tsvector不支援中日韓等方塊字。 PGroonga支援中日韓及英文等全部語言,他是用Ngram的方式切詞,預設是切兩個字,例如「偉大的PostgreSQL」會切成: 偉大 大的 的P Po os st tg gr re eS SQ QL 並用這種方式建立索引,檢索效果不錯,10幾億字內容約1~2秒可以完成搜尋(部份視硬體設備而定),就是索引稍大,建立索引的時間約要10幾分鐘。 實做 PGroonga的使用方式,首先要先下載安裝PostgreSQL: https://www.postgresql.org/download/ 不一定要最新版,PGroonga從早期的12版到最新的17版都支援。 然後在github上找「awesome-postgres」 https://github.com/dhamaniasad/awesome-postgres 然後在「Extensions」項目中找「PGroonga」的連結並進入「install」。 PGroonga支援很多os,以windows來說,先按照安裝的PostgreSQL下載安裝檔,安裝檔是一個zip檔案,解壓縮後把檔案複製到PostgreSQL資料夾,並覆蓋舊檔便安裝成功了。 安裝完後要啟動pgAdmin,倒不一定要pgAdmin,反正就是進入可以輸入SQL語法的界面就是了。然後輸入 create extension pgroonga; 執行成功即啟動pgroonga了,接著是建立pgroonga的索引,例如 create index idx_欄位名稱 on news using pgroonga (欄位名稱); 建立索引的時間視資料量多寡而定,量多自然要等久一點。索引建立後便可搜尋,簡易的搜尋語法如下: select * from 資料表 where (建立pgroonga索引的欄位) &@~ '文字'; 可以查詢單一文字 select * from 資料表 where (建立pgroonga索引的欄位) &@| ARRAY[...

網站掃描CSP弱點問題

 最近被網站弱點掃描的CSP問題困擾很久,CSP問題主要是兩種: 1.在CSP中允許內聯腳本執行 2.從CSP中缺少必要的指令 AppScan這兩個問題提供的處理方式都是「配置正確值的Content-Security-Policy」,等於沒說。 後來才發現AppScan無法處理多層的Content-Security-Policy,例如在httpd.conf中設定: default-src 'self' 'unsafe-inline'; 又在htaccess設定 script-src 'self'; 正常來說瀏覽器會採用htaccess的設定,即「script-src 'self';」而不是「script-src 'self' 'unsafe-inline'」,以安全性來說是符合的,但AppScan無法判斷,直接當你沒設定好CSP,解決方法只有不要重複設定,保留一項設定就好。

Windows使用Apache/WIN-ACME申請免費Let's Encrypt的SSL憑證

  在Windows下使用Apache架站時,申請Let's Encrypt的SSL憑證的步驟: 1.確認web的port 80可以連線 有http自動轉https的話要關掉 2.下載win-acme https://www.win-acme.com/ 解壓縮後執行wacs.exe(可能要管理員權限) 3.wacs.exe操作如下 選m 選2 輸入網址(不用加https) 選4 選1 輸入網站根目錄位置 選2 選2 輸入存檔SSL憑證的位置 選1 選5 選3 之後enter按到底,會開始自動申請憑證,申請成功後按q離開wacs.exe 4.修改http-ssl.conf 加入或修改下面三行 SSLCertificateFile "SSL憑證存檔位置/網站名稱-crt.pem" SSLCertificateKeyFile "SSL憑證存檔位置/網站名稱-key.pem" SSLCertificateChainFile "SSL憑證存檔位置/網站名稱-chain.pem" 5.重啟apache 6.自動更新憑證 寫一個bat,加到工作排程 cd C:/win-acme(就是解壓縮win-acme的地方) wacs.exe --renew --force net stop Apache2.4 && net start Apache2.4 7.追記 如果是不能直接登入網站主機只能使用網頁空間的狀況,必須先在自己的電腦上申請憑證的認證密碼,然後再上傳到網頁空間中提供驗證,方式如下: 下載 ssl-certbot https://www.markkulab.net/2021/12/26/ssl-certbot/ https://github.com/certbot/certbot/releases/download/v1.22.0/certbot-beta-installer-win32.exe 安裝 ssl-certbot後在cmd中 C:\Program Files (x86)\Certbot\bin>   輸入 certbot certonly --manual --preferred-challenges http -d 你的網址 中間會生成檔案,上傳到指定位置,然後進行驗證 1....

網站弱點掃描幾個問題

 1.盲目的LDAP注入 主要是特殊符號的關係,前後台的輸入都要過濾掉下面文字: = > < | & ! \\ * ( ) \x00 %29 %7C %28 %3D 不過經過多次的測試,這項弱點多是誤判,例如在「有傳入值印出B,不然印出C」的情況下,假如傳入的值經過篩選後變成空值,卻還是印出C,很容易就會造成誤判。 因此如果已經篩選掉上面的文字了,卻還是不能過關,很有可能程式的流程也要修改,盡量避免無傳入值還是會印出資料的狀況。假如一定要這樣寫的話,就要檢查傳入值的存在(isset),不要用有無(empty)。 2.低強度密碼組合 - ROBOT攻擊:伺服器支援有漏洞的密碼組合 在httpd.conf中加入下面三行: SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder off SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 3.查詢中的Password參數 GET、POST不能使用「word」「author」等關鍵字。

主機標頭注入的測試與應對

最近處理「主機標頭注入」弱點,花了很大力氣,總算告一段落,把相關資料筆記起來。 1.主機標頭注入是啥 弱點掃描的描述永遠是上個世紀的翻譯軟體做的,有時候寧願顯示英文orz 簡單的說就是在開啟網頁時,另外輸入header資訊,導致網站發生錯誤。 2.如何測試主機標頭注入 以PHP來說,$_SERVER['HTTP_HOST']可以取得host資料,範例如下 執行起來會是下面狀況 會把IP或網址印出來,主機標頭注入就是把HOST改掉,測試方式要使用curl。 windows版請到這裡下載:https://curl.se/download.html 下載後解壓縮,進入curl.exe所在的資料夾,開啟終端機,輸入下面指令 塗掉的地方就是網站的IP或網址,這時候可以發現$_SERVER['HTTP_HOST']的資訊被改掉了,印出的是輸入的測試資料「www.123.com」。 3.如何防範主機標頭注入 這個問題在網路上找了很久,各家方法都有,但最簡單的是改.htaccess檔,加入這幾行: RewriteEngine On  RewriteCond %{HTTP_HOST} !^ 網址或IP [NC] RewriteCond %{REQUEST_URI} !^/error [NC] RewriteRule ^.(.*) - [L,F] 這時再用curl測試,跑出來的就是403了,解決。

Google 分析 (Google Analytics) 造成的「加密的階段作業 (SSL) Cookie 中遺漏安全屬性」

 Google 分析 (Google Analytics) 的cookies會造成「加密的階段作業 (SSL) Cookie 中遺漏安全屬性」的弱點,網路上有一種解決方式,在gtag中加上參數,如下: gtag('config', 'G-XXXXXXXXXX', {'cookieFlags': 'SameSite=Strict; Secure'}); 但我的系統卻無法使用,研究了一下,要拆開寫,如下   gtag('set', 'cookie_flags', 'SameSite=Strict;Secure');   gtag('config', 'G-XXXXXXXXXX'); 要拆成兩行,Secure就可以用了。 但更簡單的方法是在httpd.conf中加入這一行 Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=Strict 解決。