Read My Blog With JavaScript

Michael Lynch

用 JavaScript 閱讀我的部落格

原文由 Michael Lynch 發布,訂閱此部落格

現在你可以用客戶端 JavaScript 來閱讀我的部落格了。我不太確定你為什麼會想這麼做,但就是可以。

也許你想在自己的網站上加入一個部落格清單,列出你喜愛部落格的最新文章,但又不想在伺服器端抓取資料。如果你想用 JavaScript 來顯示我最新五篇文章的標題,程式碼大概會像這樣:

fetch("https://mtlynch.io/index.xml")
  .then((response) => response.text())
  .then((str) => new DOMParser().parseFromString(str, "application/xml"))
  .then((data) => {
    const articles = [...data.querySelectorAll("item")].map((item) => ({
      title: item.querySelector("title").textContent,
      date: new Date(item.querySelector("pubDate").textContent),
    }));

    // Sort articles by date, newest to oldest.
    articles.sort((a, b) => b.date - a.date);

    // Print the titles of the 5 most recent articles.
    articles.slice(0, 5).forEach((article) => console.log(article.title));
  });

上面的程式碼會產生這樣的輸出:

Refactoring English: Month 10
Get xkcd Cartoons at 2x Resolution
List of 2x-resolution xkcd Cartoons
I Once Appeared in The Old New Thing
Refactoring English: Month 9

這個點子來自 Simon Willison 最近在 Lobsters 上的一則留言

要怎麼讓 JavaScript 讀取我的網站?

為了讓 JavaScript 能夠存取,我唯一需要改的就是為我的 RSS feed 設定跨來源資源共享(Cross-Origin Resource Sharing,CORS)HTTP 標頭。一般來說,會阻止其他網站在客戶端用 JavaScript 讀取彼此內容的,就是同源政策(same-origin policy)

同源政策規定,每個網站(來源,origin)只能讀取與自己網域相關的資源。舉例來說,如果你造訪我在 mtlynch.io 上的部落格,而我的網頁上有 JavaScript 試圖從 chase.com 讀取你的銀行餘額,同源政策就會禁止我頁面上的 JavaScript 存取那些資訊。

為了讓其他網站能透過 JavaScript 讀取我的部落格,我必須為部落格的 RSS feed 設定 CORS 標頭。這個部落格是靜態網站,目前託管在 Netlify 上,所以我必須修改 Netlify 的設定檔,來為我的 RSS feed 網址指定 CORS 標頭

[[headers]]
  for = "/index.xml"
  [headers.values]
    Access-Control-Allow-Origin = "*"
    Access-Control-Allow-Methods = "GET, HEAD, OPTIONS"
    Access-Control-Allow-Headers = "Content-Type"

可能會出什麼問題?

CORS 是一種安全機制,對於要放寬對外網站的安全限制,我一向會保持應有的謹慎。不過我花了一些時間評估風險,在我的情況下,我看不出有什麼實質的風險。

攻擊者能竊取機密資料嗎?

同源政策的目的在於,如果使用者在 A 網站上有敏感資料,那麼 B 網站就不能存取其中的任何資料,除非 A 網站明確授權。

我的部落格是沒有任何機密資訊的靜態網站。當我造訪 mtlynch.io 時,我看到的內容跟其他人看到的完全一樣。所以,即使攻擊者誘使我在第三方網站上執行惡意 JavaScript,那段程式碼也無法濫用我在部落格上的權限,因為我在這裡根本沒有任何特殊權限。

我確實有使用TalkYard 來提供嵌入式留言功能,而且我在那裡擁有管理員權限,但我 RSS feed 的 CORS 設定並不會影響到 TalkYard。

攻擊者能對我發動 DDoS 攻擊嗎?

一開始,我以為攻擊者可能會濫用 CORS 設定來對我的網站發動 DDoS 攻擊。如果攻擊者讓數百萬人造訪一個頁面,而該頁面在背景用 JavaScript 不斷請求我的 RSS feed,會怎麼樣呢?

後來我才意識到,這種 DDoS 攻擊本來就做得到。CORS 只控制第三方網域是否能讀取請求的結果,但根本不會阻擋請求本身。無論 CORS 設定為何,任何網域都可以對其他任何網域發送 GET 和 POST 請求。

攻擊者能假冒我的網站嗎?

我考慮到的另一種攻擊是假冒。訪客可能會前往 evil.example.com,而那裡的伺服器回傳的 JavaScript 會在訪客的瀏覽器中重建我的部落格,儘管網址列上顯示的仍然是 evil.example.com。

這種攻擊或許可行,但無論我的 CORS 設定如何,都有更簡單的方式可以假冒我的部落格。冒充者可以架設一個會將請求轉發到我部落格的 HTTP 代理伺服器,這是更簡單的假冒方式。或者,他們也可以直接擷取我的網站內容,放到別的地方託管。

為什麼要讓 JavaScript 讀取我的部落格?

沒有人要求我為 RSS feed 啟用 CORS,所以我也不確定這是否真的對誰有好處。但我喜歡開放的網路,而這是一個讓其他網站能與我的網站互相串連的有趣方式,所以我想說,何樂而不為呢?

如果你因為這項改變而用我的 RSS feed 做了什麼有趣的事,歡迎告訴我

本文章由 muse-spark-1.2-contributor 進行翻譯

留言