网站首页/技术开发列表/内容

论坛编程给开发者的建议

技术开发2022-07-19阅读

系列问题上

  论坛,英文翻译是Forum,作为网络上必不可少的交流平台。在网站中有着举足轻重的地位,大家知道论坛的种类相当多。ASP、CGI、PHP、JSP甚至C++开发的,而品牌更是数以百计,正是这样,每个论坛都存在着这样那样的问题,其中安全问题又尤为突出。有不少网站就是因为论坛出了问题而导致服务器被渗透,在安全上怎么重视都不过份!由于我使用ASP论坛比较多,所以谈谈ASP论坛。

  给开发者的建议

  数据库问题

  数据库似乎是每个使用者都比较头疼的问题,被下载、被泄密。其实开发者多下些工夫。数据库采用MD5加密(兼容行下降,自己平衡吧)。这样泄密问题就得到了很好的解决,不管是谁。通过什么途径看到数据,都是加密过的字符串,最大限度的解决了数据库泄密的问题,这点动网做得很好,值得其他论坛借鉴。然后就是防下载了。在数据库中加一个表,因为我不擅长描述,所以大家可以直接下载动网论坛V5.0 0519 sp3(URL:http://www.aspsky.net/download/list.asp?id=2178),里面有这样一个数据库,导入里面的那个notdownload表(大家可以自己研究构造,其实我自己也说不清楚,呵呵),然后就把数据库的扩展名改为.asp就可以防下载了,即使知道数据库路径,下载也是500错误。这个应该由开发者做的。

  密码验证问题

  密码是系统的首席看门官,大部分的攻击都是截获或猜解密码开始的,所以对于登陆的规定还有需要验证的地方的防范一定要做好。开发者应该限制密码的最小长度为8,最好加入随机验证码,限制登陆失败的次数,如果输入用户名、密码、随机验证码错误导致登陆失败3次后,就会自动关闭,另外,提示密码错误的消息不宜显示在HTML页面里,而应该由谈出消息框来显示出错信息,这几个措施都能有效的防止溯雪这一类工具暴力破解,这类工具的原理是判断页面源代码中的某一标签进行破解的,一般是先获取错误页面的的某个标签,然后提交数据,拿返回的数据和刚才获取的错误标签进行对比,如果遇到了和错误标签不同的标签。则视为正确的,只要了解原理了,就知道上面的三种措施是多么有效。还有尽量不要在页面显示密码。比如在快速回复的地方查看原代码。找到类似的 “密码 <input maxlength=20 type=password name=Pass value="***********" size="20">”地方。其中“***********”就是密码了。这样用户登陆后。离开一下,别人马上查看原代码就可以看到密码了,非常不安全啊!其实通过Cookies和Session判断也是有一定缺陷的。Session完全保存在服务器端,是绝对安全的。所以只有开发者平衡一下了。选个折中的方法,还有也尽量少用type=hidden来隐藏信息。会HTML的人一看就知道了。不过如果像刚才所说的采用MD5加密,就不会看到真实的密码了。查看原代码的时候就只是value="f3b4sd5f47fh49ah3"。(此字符串已经改过)

  UBB解析问题

  相当多的留言本和论坛都存在这样的问题,比如[img]pic_url[/img]可以显示一张图片,但如果代码转换不好,就可能被执行跨站脚本,最简单的测试方法就是提交[img]javascript :alert();[/img]这样的信息,(标签视程序而定),如果弹出一个对话框就说明存在此漏洞,有的虽然已经过滤了。但可能把提交的信息转换为ASCII代码,还是有可能执行跨站脚本的,跨站脚本的危害不定,可以弹出一些信息来,如果HTML代码不过滤好。可以修改主页的格局;更有攻击者,写个窃取用户的COOKIES资料的脚本引导用户访问,最惨的还可能格式化浏览者的硬盘。下面又是一个简单的例子。

  [img]javascript :document.write();[/img]

  document.write('');里面的单引号'' 和句点.要用ASCII转换,否则对稍有过滤的程序就不会生效。里面可以写任何代码。修改注册表、格式化硬盘……如果UBB过滤得好,就没事。

  看懂的朋友觉得严重吗?下面付上一段处理脚本字符的代码。仅供参考。也许有错误和遗漏。

  Function JScode(JSstr)
  dim jsstr:jsstr=jsstrs
  if jsstr="" or isnull(jsstr) then JScode"":exit function
  if not isnull(JSstr) then
  dim ts
  dim re
  dim reContent
  Set re=new RegExp
  re.IgnoreCase =true
  re.Global=True
  re.Pattern="(javascript)"
  ts=re.Replace(JSstr,"&#106avascript")
  re.Pattern="(jscript:)"
  ts=re.Replace(ts,"&#106script:")
  re.Pattern="(js:)"
  ts=re.Replace(ts,"&#106s:")
  re.Pattern="(value)"
  ts=re.Replace(ts,"&#118alue")
  re.Pattern="(about :)"
  ts=re.Replace(ts,"about&#58")
  re.Pattern="(file:)"
  ts=re.Replace(ts,"file&#58")
  re.Pattern="(document.cookie)"
  ts=re.Replace(ts,"documents&#46cookie")
  re.Pattern="(vbscript:)"
  ts=re.Replace(ts,"&#118bscript:")
  re.Pattern="(vbs:)"
  ts=re.Replace(ts,"&#118bs:")
  re.Pattern="(on(mouse|exit|error|click|key))"
  ts=re.Replace(ts,"&#111n$2")
  re.Pattern="(&#)"
  ts=re.Replace(ts,"&#")
  JScode=ts
  set re=nothing
  end if
  End Function

 

……

相关阅读