[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,如需转载请自行联系原作者

相关文章
|
搜索推荐 JavaScript 前端开发
ESLint 禁止规则出现警告的 5 种方式
ESLint 禁止规则出现警告的 5 种方式
909 0
|
Java
isv.code-invalid(授权码code无效)-自查方案
说明:  针对商户测试第三方应用授权、用户信息授权、获取会员信息等产品时,报错“isv.code-invalid(授权码code无效)”的问题。 第三方应用授权正式环境拼接规则: https://openauth.
3776 0
|
2月前
|
Web App开发 移动开发 开发者
mPaaS问题之提示License验证失败如何解决
mPaaS配置是指在mPaaS平台上对移动应用进行的各项设置,以支持应用的定制化和优化运行;本合集将提供mPaaS配置的操作指南和最佳实践,助力开发者高效管理和调整移动应用的设置。
45 1
|
3月前
|
存储 安全 Android开发
Android安全启动学习(三):AVB校验的内容、怎么校验、AVB的作用
Android安全启动学习(三):AVB校验的内容、怎么校验、AVB的作用
141 0
|
11月前
SAP ABAP 检查事务码权限
检查用户是否有自开发事务码的权限
92 0
|
11月前
|
SQL Oracle 关系型数据库
gt-checksum 1.2.1发布,新增表结构校验及修复等超实用特性
gt-checksum 1.2.1发布,新增表结构校验及修复等超实用特性
|
监控 Linux Windows
[wgcloud-agent]2022/07/01 00:13:46 WgcloudAgent.go:287: 防篡改校验错误次数大于10次,不再上报数据: 32
WGCLOUD监控平台在运行中,发现主机下线了,查看agent日志,发现以下错误日志
[wgcloud-agent]2022/07/01 00:13:46 WgcloudAgent.go:287: 防篡改校验错误次数大于10次,不再上报数据: 32
EXIST_FORBIDDEN_WORD(订单信息中包含违禁词)自查方案
错误原因   该报错是因为商户的请求参数中的body或是subject参数中包含有违禁词汇导致 解决方案   修改订单信息中的body和subject参数,保证尽量不会触及敏感词汇,如:支付宝交易测试,测试交易等信息。
696 0