过滤危险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:  

php数组排序函数

On 08/26/2010, in php, by kilobug
/* 数组排序 */
function array_sort( $data, $order = array() ) {
	if( !$data || !$order ) return $data;
 
	$arglist = array();
	foreach($data as $k => $v)
		foreach($order as $k2 => $v2) {
			if( !isset($arglist[$k2]) ) $arglist[$k2] = array();
			$arglist[$k2][$k] = $v[$k2];
		}
 
	$argstr = '';
	foreach( $order as $k => $v )
		$argstr .= ',$arglist[\''.$k.'\'], SORT_'.$v;
	$argstr{0} = ' ';
 
	eval('array_multisort('.$argstr.',$data);');
	return $data;
}

说明:array_sort($data, $order)
参数:
array $data: 需要排序的数组
array $order: 排序,格式:array(‘键名’ => ‘DESC|ASC’…)

实例:

$array = array(
    array(
        'uid' => 100,
        'username' => 'kilobug',
    ),
    array(
        'uid' => 99,
        'username' => 'kilobug',
    ),
    ....
);
$array = array_sort($array, array('uid' => 'DESC', 'username' => 'ASC'));
var_dump($array);
Tagged with:  

好友动态数据库设计思路

On 08/26/2010, in mysql, by kilobug

table: behavior 行为表
table: friend_behavior 好友行为关系表

table [behavior] field:
bid[int 10]:行为ID
uid[int 10]: 用户ID
event[varchar 20]:事件(如添加好友则用friend_add表示
behavior[text]: 行为内容(json序列化数组后的字符串)
flagid: 标识ID,用于删除动态
lastime[int 10]: 最后时间
table [behavior] index:
bid: 主键
uid, event, flag: 联合唯一索引

table [friend_behavior] field:
uid: 用户ID
fuid: 好友ID
bid: 行为ID
lastime: 最后时间
table [friend_behavior] index:
uid, fuid: 联合普通索引
bid: 普通索引

实例:
1、查询指定用户最新的好友动态:

SELECT fb.fuid, b.event, b.behavior, b.lastime FROM `friend_behavior` fb LEFT JOIN `behavior` b ON(b.`uid`=fb.`fuid`) WHERE fb.`uid`=xxx ORDER BY b.`lastime` DESC

2、查询指定用户最新的动态

SELECT uid, event, behavior, lastime FROM `behavior` WHERE `uid`=xxx ORDER BY `lastime` DESC

……

Tagged with:  

php产生指定范围长度的随机字符

On 08/26/2010, in php, by kilobug
function random( $min, $max = NULL ) {
	$len = isset($max) ? mt_rand($min, $max) : $min;
	$str = '';
	for($i = 0; $i < $len; ++$i)
		$str .= chr(mt_rand(32, 128));
	return $str;
}

说明:random($min[, $max])
参数:
int $min: 最短长度
int $max[option]: 最大长度

Tagged with:  
<img src="" onerror="this.onerror=null; this.src='替换图片路径';" />

Notes: 其中的this.onerror=null是为了防止指定图片无法加载导致内存溢出的问题;

Tagged with:  
width = document.body.scrollWidth;
height = document.body.scrollHeight;
if(document.documentElement){
	width = Math.max(width, document.documentElement.scrollWidth);
	height = Math.max(height, document.documentElement.scrollHeight);
}

说明:
width:浏览器内容宽度
height:>=浏览器内容区域可见高度

Tagged with:  

动态执行html中的js

On 08/25/2010, in javascript, by kilobug
function execHtml( str ){
	var match, reg = /\<script[^\>]*\>(.*?)\<\/script\>/gi;
	while( (match = reg.exec(str)) != null )
		str = str.substr(0, match.index) + eval(match[1]) + str.substr(match.index+match[0].length);
	return str;
}

说明:execHtml(str)
参数:
string str: html和js混合字符串

Notes: 不支持document.write[ln]操作

Tagged with:  

js停止冒泡事件

On 08/25/2010, in javascript, by kilobug
function cancelBubble( e ) {
	if ( e && e.stopPropagation ) e.stopPropagation();
	else window.event.cancelBubble = true;
}

说明:cancelBubble(e)
参数:
event e: 元素事件

Tagged with:  

js计算字符串字节长度

On 08/25/2010, in javascript, by kilobug
function byteLength(str) {
	var byteLen = 0, len = str.length;
	if( !str ) return 0;
	for( var i=0; i<len; i++ )
		byteLen += str.charCodeAt(i) > 255 ? 2 : 1;
	return byteLen;
}

说明:byteLength(str)
参数:
string str: 要计算字节长度的字符串(非ASCII的字符算2字节)

Tagged with:  

js设为首页

On 08/25/2010, in javascript, by kilobug
function homepage(){ // 设置为首页
	var url = arguments[0];
	if( typeof(url) == "undefined" ) url = location.protocol + '//' + location.host;
	if( typeof(document.all) == 'object' ) {
		document.body.style.behavior = "url(#default#homepage)";
		document.body.setHomePage(url);
	}else if( typeof(sidebar) == 'object' && typeof(netscape) == 'object' ) {
		try{
			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
			Components.classes['@mozilla.org/preferences-service;1'].getService(Components. interfaces.nsIPrefBranch).setCharPref('browser.startup.homepage',url);
			alert('成功设置 '+url+' 为Firefox首页');
		} catch (e) { alert( "该操作被浏览器拒绝,如果想启用该功能,请在地址栏内输入 about:config,然后将项 signed.applets.codebase_principal_support 值该为true" ); }
	}else alert('您使用的浏览器不支持javascript设为首页!\n请手动设置,或使用IE/火狐浏览器!');
}

说明:homepage([url])
参数:
string url[option]: 收藏的网址,默认为当前域名(如http://www.kilobug.com/xxxxx,则取http://www.kilobug.com)
Notes: 不支持chrome

Tagged with:  

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