/* 过滤危险html */ function filter_html( $str ) { /* 过滤style标签 */ return preg_replace_callback( /* 过滤style标签内容 */ '/(\<\s*style[^\>]*\>)((?:(?!\<\s*\/\s*style\s*\>).)*)(\<\s*\/\s*style\s*\>)?/i', create_function('$str', 'return $str[1] . filter_css($str[2]) . $str[3];'), preg_replace( array( /* 删除html注释 */ '/\<\!\-\-.*?\-\-\>/i', /* 删除标签:script、link、object、embed、iframe、frame、frameset */ '/\<\s*(script|object|embed|link|i?frame(set)?)[^\>]*\>(.*?\<\s*\/\s*\\1\s*\>)?/i', /* 删除事件、javascript协议、css表达式 */ '/\<[^\>]+((on[a-z]+\s*\=|(javascript|vbscript|behavior)\s*\:[^\;\"\\\']|(import|expression)\s*\()[^\>]*)+\>?/i', ), '', $str ) ); } /* 过滤样式正文 */ function filter_css( $str ) { /* 删除注释、javascript协议、表达式 */ return preg_replace(array('/(\/\*((?!\*\/).)*\*\/|\/\*|\*\/)/i', '/(expression|import)\s*\((.*?\))?|(javascript|vbscript|behavior)\s*\:/i',), '', $str); }
过滤步骤:
1、删除html注释(防止用这个来绕过第二步);
2、删除script、link、object、embed、iframe、frame、frameset以及拥有on开头、包含javascript:[^;]或expression的属性的标签;
3、删除css中的注释(防止用这个来绕过第四步);
4、删除expression表达式、javascript协议、behavior属性、import属性、vbscript协议;
PS: 还有什么漏洞请email到 webmaster(a)kilobug.com