/* 过滤危险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
/* 数组排序 */ 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);
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
……
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]: 最大长度
<img src="" onerror="this.onerror=null; this.src='替换图片路径';" />
Notes: 其中的this.onerror=null是为了防止指定图片无法加载导致内存溢出的问题;
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:>=浏览器内容区域可见高度
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]操作
function cancelBubble( e ) { if ( e && e.stopPropagation ) e.stopPropagation(); else window.event.cancelBubble = true; }
说明:cancelBubble(e)
参数:
event e: 元素事件
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字节)
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
