过滤危险html标签及属性

On 08/28/2010, in php, by kilobug
 
/* 过滤危险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

Tagged with:  

One Response to 过滤危险html标签及属性

  1. Kevin says:

    js 过滤 出错啊 ···

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

无觅相关文章插件,快速提升流量