所谓彩蛋,就是在某软件中隐藏的一些小功能或信息,如windows 3.1中有,FlashFXP中也有。
其实,PHP也有复活节彩蛋,如左边的就是Zend Logo彩蛋,相信大家在phpinfo()中见过一部分,下面是所有的。
找任意一个你确认运行着PHP的站点,例如我的博客,在确认其是一个PHP页面后(在一个.html或.jpg之类的是无效的),在其网址结尾加上?=及以下任意一段字符后访问:
从上面的图可以看出:
1)对于is_null()函数,只要未定义或未赋值(赋值为null的,也算未赋值)过,就算是true。所谓赋值操作,就是$变量=值,包括$x=array(),也是赋值操作。
今天闲来无事,分析一下Bo-blog的代码。
其中碰到了两个函数,一个是microtime(),用于计算代码执行花了多少时间。另一个是list(),用于分配一组数据到一个数组中。
microtime()的返回格式为“msec sec”的字符串,其中 sec 是当前的 Unix 时间戳,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。 如:0.87605300 1246631746,前面红色字串是微秒部分,后面蓝色字串是秒的部分(Unix Timestamp)。顺便提一下,如果你用time()函数的话,仅返回蓝色的秒的部分。我们可以设计一个函数getMicroTime(),返回值是return sec + msec,如上面的例子,返回1246631746.87605300。
今天在替Bo-blog添加一个“本站热门日志”功能的时候,无意中发现人家的代码里有一句msubstr(),我一下子没认出来是什么东西。
于是我Google了一下(放心,我从来不“百度了一下”的,鄙视百度
),发现这个函数与substr()有关,是substr函数的多字节字符版(multiple byte string)。
$sql='UPDATE pw_user SET `onlineip`=$onlineip WHERE `uid`=$winduid';
再看$onlineip是怎么来的:
if($_SERVER['HTTP_CLIENT_IP'])
$onlineip=$_SERVER['HTTP_CLIENT_IP'];
else if($_SERVER['HTTP_X_FORWARDED_FOR'])
$onlineip=$_SERVER['HTTP_X_FORWARDED_FOR'];
else
$onlineip=$_SERVER['REMOTE_ADDR'];
$onlineip =substrs($onlineip,16);
十六个字节,够提升权限的了吧?抓包提交HTTP_X_FORWARDED_FOR。
这类文章用于说明PHP的漏洞、PHP安全性不如ASP或JSP,那就说明你就是个人云亦云的外行!
这只能说明在处理SQL语句时一定要检查SQL语句中变量的真实情况罢了。
再次请编程人员记住:客户端返回的数据都是不可信的,一定要再三校验,尤其是处理SQL(尤其是update或set等更新数据库的语句)!
但是,连这样普通的一个判断用户真实IP的代码,都有可能被伪造,说明了其实潜在的危险还是蛮大的。
所以在SQL执行插入前,一定要用合适的方法先进行校验,而且SQL中变量两端加上引号!本例中如果变量加上引号,应该问题也会好一点。不过加上引号,恶意用户也能在$onlineip中加入引号以提前结束SQL的。这里显示应该用正则来检验/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/。



2010/06/27

