UBB中正则表达式不当导致系统Bug

现在很多论坛、博客和留言本系统中都采用了UBB机制,这样用户就可以间接的使用一些简单的HTML。其原理是规定一些特殊的语法,如:[img]001.gif[/img]代表显示一张图片;[url=www.mzwu.com]mzwu[/url]代表显示一个链接,然后再利用正则表达式进行查找替换,最终为<img src="001.gif">和<a href="www.mzwu.com">mzwu</a>。这边正则表达式如果书写不当就可能使一些用户得以在系统中执行脚本,下边我们举一个例子说明:

<%
function ubb2html(str)
Dim reg,content
content = str
Set reg = new RegExp
reg.Pattern = "\[img\](.[^\]]*)\[\/img\]"
reg.IgnoreCase = true
reg.Global = true
content = reg.replace(content,"<img src=""$1"" border=""0"">")
ubb2html = content
end function
%>

"[img]001.gif[/img]"经函数ubb2html转换后就成了<img src="001.gif" border="0">。那我们构造"[img]001.gif"" onerror=""alert(document.location.href);[/img]"这样的字符串提交经转换后就成了<img src="001.gif" onerror="alert(document.location.href);" border="0">,如果图片不存在就将执行onerror语句!有了这样的权限我们还有什么不能干的呢?

解决方法一:书写恰当的正则表达式
将"\[img\](.[^\]]*)\[\/img\]"改为"\[img\](.[^\]""]*)\[\/img\]"增加对双引号的过滤。

解决方法二:对匹配字符串进行过滤
<%
function ubb2html(str)
Dim reg,content
content = str
Set reg = new RegExp
reg.Pattern = "\[img\](.[^\]]*)\[\/img\]"
reg.IgnoreCase = true
reg.Global = true
Set strMatches=reg.Execute(content)
For Each strMatch In strMatches
    tmpStr1=CheckLinkStr(strMatch.SubMatches(0))
    content = replace(content,strMatch.value,"<img src=""" & tmpStr1 & """ border=""0"">")
Next
ubb2html = content
end function
Function CheckLinkStr(Str)
    Str = Replace(Str, chr(39), "&#39;")
    Str = Replace(Str, chr(34), "&quot;")
    '继续自行添加
    CheckLinkStr = Str
End Function
%>

上一篇: NOKIA3100上网参数设置
下一篇: SubMatches 集合
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
最新日志:
评论: 1 | 引用: 0 | 查看次数: 5016
发表评论
登录后再发表评论!