The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

從戰國策資訊外洩事件說明 robots.txt 定義檔與資安常識

今天從資安人雜誌的電子報中發現一則駭人聽聞的熱門新聞:『戰國策4,270筆資料外洩 Google全都露』。我上網研究了一下,果然還有許多非 Google 的搜尋引擎還殘留著快取住(Cached)完整的客戶資料與鉅細靡遺的訂單資訊,包括公司資訊、連絡人、電話、地址、身份證字號、購買了什麼服務、何時到期、折扣、帳號、密碼、.... 簡直什麼死人骨頭都在上面,這實在是太恐怖了,真無法想像這些資料落入詐騙集團手中後,這些客戶是何下場。

話說到此,就要提及今日的重點了,我問過許多朋友知不知道 robots.txt 這檔案是做什麼用的,有些人聽都沒聽過、有些人有聽過,但好像大多都沒在使用。(不清楚的請先看這裡

像我們公司有對外的測試機都一定會加上 robots.txt 設定檔,內容如下:

User-Agent:*
Disallow:/

意思就是:不允許任何來爬我網站的Web漫遊器(Crawler)或網路蜘蛛(Spider)抓我網站的內容。

請注意:robots.txt 此檔編碼一定要是 ANSI 或 UTF-8 without BOM 才行,若加上了 BOM 字元會導致 Google Crawler 無法正確解析此檔案。

特別要加上這段就是因為網站還不完整,但客戶想先看還是要給他們看,但除了客戶能看之外,網路上許多 Crawler 也在看。像我們有時後網站後台的權限系統都會在最後才建置,這代表在建置網站的過程中可能會有一段時間不用任何帳號、密碼就可以登入。若真的要避免資訊外洩,通常我們會做出以下措施:

  • 將測試網站擺在公司內網,不提供對外連結
  • 若網站一定要對外開放,也應該設定限制 IP 存取
  • 若不能限制 IP 存取,也應該設定帳號、密碼
  • 若連帳號、密碼都不能設定,那就乖乖的設定 robots.txt 檔案吧! 通常這些 Crawler 都會遵循網路的禮節,被定義為 Disallow 的目錄他們是不會來抓網頁的。

也許有時後客戶為了某些理由會要求網站先上線,但上線前我們一定要仔細評估資訊安全的風險,因為替客戶把關資訊安全是我們的責任,也是我們的專業,堅守住自己的原則真的很重要。有時後因為成本考量,的確要做出一些取捨,但自己的底線總是要的,你要非常清楚你的工作、你的專業、你的責任,這需要自律(self-disciplined)。

各位應該也很清楚「懶惰」是程式設計師的「美德」,沒有懶惰的個性就沒有精簡又可模組化的程式。但缺乏自律的程式設計師,不但做不好事,可能連還會害客戶遭受池魚之殃。所以正確的觀念應該是:「你可以懶,但要懶得有有品質,懶到讓大家尊重你,看到你的價值」。

一般人對於資訊安全的敏感度很低,即便是開發人員也一樣,沒有危機意識的人很容易就會寫出易受傷(Vulnerable)的程式碼,像戰國策這次的資訊洩漏(Information Leakage)事件很明顯的就是他們有人認為「這網址只有我知道,搜尋引擎應該查不到我這裡吧」。

跟各位講,我從不安裝 Google Toolbar 或其他跟搜尋有關的 Toolbar,因為你要是沒設定好,他會自動將你所有瀏覽過的「網址」傳送出去,讓他們的 Crawler 來抓取網頁。你可以不裝,但你的客戶可不見得都會聽你的,總會有人做出對資安不利的事,你唯一能做的就是把所有可能發生的風險都考量進去,凡事以最壞的狀況(worst-case)做打算就是了。

最後,再分享一個使用 robots.txt 的技巧:

若你真的有些網址不希望讓 Crawler 來抓取網頁,也不想讓其他來抓你某個目錄的網頁,或根本不想讓不相干的人知道你有這個目錄的話,建議你還是不要將定義寫到 robots.txt 中,因為 robots.txt 畢竟還是個公開的檔案,任何人都可以下載的。

舉個例子來說,我剛剛看了一下戰國策的網站所定義的 robots.txt 定義檔,內容如下:

User-agent: *
Disallow: /admin/

這時可以套用一句成語:「此地無銀三百兩」,因為這擺明了跟人家說「我家的網站管理介面在 /admin/ 目錄下」,雖然 /admin/ 直接連接是連不進去的,但透過 Google 搜尋:  site:www.nss.com.tw /admin/ 多少還是可以猜出一些後台的路徑或檔名。

總之,不想讓人家知道,就不要列在 robots.txt 了。不怕人家知道,那就大膽的放吧。

ASP.NET 2.0 的安全機制我覺得很漂亮,可以針對目錄做授權的單位,例如你可以在 /admin/ 目錄下放置一個 web.config 檔,內容設定如下:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</configuration>

所以任何目錄下的檔案不管是程式或靜態檔案都可以受到保護,但要是在 PHP 的執行環境下就不容易這麼做了,你的程式若真的漏了檢查權限的程式碼,就有可以被入侵,而且有些非程式的靜態檔案也容易被下載。

相關連結