php

过滤危险html标签及属性

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


php数组排序函数

/* 数组排序 */
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);

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

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]: 最大长度


php5.x扩展:xxtea可逆加密

最近在学习开发php5.x扩展,就拿xxtea加密算法来练手;

此扩展采用国外的xxtea加密算法,配合md5、base64,实现php下可逆加密功能;

扩展函数:
xxtea加密函数

function xxtea_encode(string $str, string $key[, bool $is_base64])

parameter:
$str: 需加密的内容,可以是二进制内容
$key: 密钥
$is_base64[可选]: 结果是否进行base64编码,默认为true
return: [二进制|字符串]

xxtea解密函数

function xxtea_decode($str, $key[, $is_base64])

parameter:
$str: 需解密的内容,可以是二进制内容
$key: 密钥
$is_base64[可选]: 密文是否base64编码过,默认为true
return: [二进制|字符串]

扩展源码下载:php_xxtea.zip

BUG: 当加密的字符长度小于2,无法加密,返回原值

有关tea算法资料:http://en.wikipedia.org/wiki/XXTEA

算法描述:

“微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。

TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 – 1)231」(也就是程序中的 0×9E3779B9 )。”

其实,TEA跟我们的关系非常密切,因为QQ就是使用16轮迭代的TEA算法。

XXTEA是其最新的变种,于1998年提出。目前还没有人找到对其进行攻击的方法,是对前面一些变种的改进。XXTEA 算法很安全,而且非常快速,非常适合应用于 Web 开发中。


vccool.com开始动工…

域名:vccool.com
主题:非主流社区
功能模块:待定…
动工期:2010年8月1日
预计完工期:待定


php匹配utf-8编码的中文的正则

/[\x{4e00}-\x{9fa5}]+/i

php截取函数,可代替mb_substr

适用于无法安装mbstring扩展的环境

注:尽量使用mbstring扩展,纯php代码执行效率比扩展慢几十倍;

function mb_substr($str, $start = 0, $length = 0, $encode = 'utf-8') {
    /* 该编码每个非英文字符的字节长度 */
    $encode_len = $encode == 'utf-8' ? 3 : 2;
    /* 计算开始字节 */
    for($byteStart = $i = 0; $i < $start; ++$i) {
        $byteStart += ord($str{$byteStart}) < 128 ? 1 : $encode_len;
        /* 当起始坐标超出字符串,则返回空值 */
        if( $str{$byteStart} == '' ) return '';
    }
    /* 计算字节长度 */
    for($i = 0, $byteLen = $byteStart; $i < $length; ++$i)
        $byteLen += ord($str{$byteLen}) < 128 ? 1 : $encode_len;
 
    return substr( $str, $byteStart, $byteLen-$byteStart );
}

php读取二进制流

将php数据转换为二进制数据

string pack ( string $format [, mixed $args [, mixed $...]] )

将二进制数据转换为php数据

array unpack ( string $format, string $data )

(continue reading…)


UCenter跨域名同步登录机制

采用p3p协议,当登录成功后,在提示页面中以引用js的方法,调用其他域名的api接口,接口写cookie;


php的正则模式修正符

i (PCRE_CASELESS)
如果设定此修正符,模式中的字符将同时匹配大小写字母。

m (PCRE_MULTILINE)
默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的 起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。

当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

s (PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。

(continue reading…)


Copyright © 1996-2010 KiloBug. All rights reserved.
iDream theme by Templates Next | Powered by WordPress