問題是做像 Digg 類的投票功能 (那個 "Digg" 的點擊),想要做到這幾點:
- 在有 Javascript 的情況下使用 XHR (XMLHttpRequest) 更新,也就是使用 AJAX。
- 在沒有 Javascript 的情況下可以 Graceful Degradation,也就是說用 pure HTML 的方式送出 (像是 form 或是 a link)。
- 語意正確。
一開始的想法是這樣做:
- 用 a link 設定
/vote.php?id=123
作為 Graceful Degradation,vote.php 更新完資料庫後再重導回原頁面。 - 在這個 a link 上加上 onclick 物件,以 XHR 的方式送出並更新,這邊定為
/vote.php?id=123&ajax=1
。
不過這樣的問題在於可以使用 <img src=...>
直接指定投票 url 而票數爆衝 (Digg 發生過),不知道後來是怎麼解決 Graceful Degradation 問題的...
我想到的方法是利用 MAC 類的方法加上簽名:把預設的 a link 加上 &sign=xxx
,其中 xxx 是 sha1("$secretkey-$username-$id") (或是類似的方式產生),而 XHR 的部份改成用 POST 送。
有建議嗎?
我的做法是全都用 POST 的,再抽 HTTP Header (x-requested-with) 去判斷是否來自 AJAX。
背後再加一層 HTTP referer checking 防詐,但這有得有失,因為可能會擋了不知自己block了referer及JavaScript的用家。(例如裝了甚麼 Internet Security 之類的用家)