[Debugging]分析博客园提交评论的校验规则
今天偶然發現,在博客園同時打開多篇文章,如果短時間內分別在不同文章里提交相同內容的評論,就會提示"該評論已發表過!"。一開始感覺這應該是個bug,畢竟在同一篇文章里,并不存在相同的評論。后來經過反復測試,通過Fiddler可以發現,這個提示信息是在后臺http://www.cnblogs.com/ws/CommentService.asmx里的?AddComment返回的:
| 1 2 | //AddComment方法返回的信息 {"d":{"__type":"BlogServer.Web.WS.ReturnValue","IsSuccess":false,"CommentID":0,"ReturnData":"該評論已發表過!"}} |
從頁面里的PostNewComment()方法中這段代碼的注釋中:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $.ajax({ ????url: '/ws/CommentService.asmx/AddComment', ????data: $.toJSON(comment), ????type: "post", ????dataType: "json", ????contentType: "application/json; charset=utf8", ????success: function(data) { ????????if?(data.d) { ????????????if(data.d["IsSuccess"]){ ????????????????var?dt = (new?Date()).getTime()-startDate; ????????????????ShowCommentMsg("感謝您的回復:)"?+ " 提交耗時"+dt+"毫秒");??????????????????????? ????????????????//RereshComments2(comment.parentId);? ????????????????$("#tbCommentBody").val(''); ????????????????$("#divCommentShow").html($("#divCommentShow").html()+data.d["ReturnData"]);????????????????? ????????????????//$("#divCommentShow").html(data.d["ReturnData"]+content.replace(/\n/g,"<br/>")+"<br/><br/>");???????????????????????? ????????????????CommentNotify(data.d["CommentID"]);??????????????????????? ????????????????}else{ ????????????????//就是在這里給出的提示信息 ????????????????ShowCommentMsg(data.d["ReturnData"]); ????????????????$("#span_comment_posted").html('');??????????????????????? ???????????} |
可以發現,前面返回信息中的“IsSuccess”和“ReturnData”屬性決定了給出了這個提示。如此說來這似乎是博客園在后臺里有意加入的一個限制,大概的邏輯好像是:不管是否同一篇文章,在一段時間內不能提交相同內容的評論。換句話說,即使相同內容的評論,在同一篇文章里,只要間隔時間足夠長,還是可以反復提交的。在相同文章里,有下面這個限制:
| 1 2 3 4 | if($("#span_comment_posted").html()!=''?&& $("#span_comment_posted").html()==content){ ?????alert("該評論已發表過!"); ????return; }? |
這段腳本決定了,對于同一篇文章,不能反復提交相同評論,但是這種邏輯不能阻止交替提交相同的評論。從為了防止惡意刷屏的角度來說,這個限制應該還算是比較合理的,只是相同頁面已經有了alert("該評論已發表過!");限制,如果跨頁面提交相同評論的時候,這個提示信息如果能改成"XXX秒內,不允許提交相同評論!"更直觀一點,不容易產生歧義。
綜合前面所有的分析,最后對博客園的評論校驗規則的實現做個總結:
首先,會在客戶端通過比較span_comment_posted緩存的內容,判斷是否連續提交了相同評論,并直接在客戶端通過alert給出提示信息,因為在刷新頁面或切換到其他頁面以后span_comment_posted內容就沒意義了,所以這種校驗只在相同頁面內且沒有人為刷新過時有效。
其次,就是在后臺的CommentService里,限制在一段時間內(好像是60秒)不能連續提交相同的內容。這種方式比較可靠,不管是否刷新頁面,是否跨頁面,都不會影響校驗規則。
最后,好像在CommentService里還有一個連續提交多少次評論以后,就會提示"提交評論太頻繁!"的校驗,實現方式跟前者應該一樣。
總體感覺博客園的校驗規則還是比較完善的,除了上面說過的提示不太準確,暫時沒有什么好的意見,各位看客有什么更好的意見,不妨說出來大家一起討論。
本文轉自Justin博客園博客,原文鏈接:http://www.cnblogs.com/justinw/archive/2009/12/20/1628021.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的[Debugging]分析博客园提交评论的校验规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thread.currentThread
- 下一篇: ACM 2017 ACM-ICPC 亚洲