2013年7月11日星期四

PHP全局变量不能生效

1.PHP全局变量不能生效错误重现

问题出现在用我的简易框架时,在view中使用原来第三方定义好的函数时(此函数比较独立),下面模拟一下:

t1.php

  1. < ?  
  2. run(); //执行  
  3. function run(){  
  4. include 'func.php';  
  5. showGlobal();  
  6. }  
  7. ?> 

func.php1

  
  1. < ?  
  2. $vars = 'I am global!';  
  3. function showGlobal(){  
  4. global $vars;  
  5. print('我使用全局变量:'.$vars);  
  6. }  
  7. ?> 

很简单的两个文件(第一次发现问题时,远比这复杂,在一层层排错后,得出最少化的问题重现环境),func.php是定义好的第三方函数,该函数使用了一些全局变量,如果这时把这两个文件放在一起,执行一下t1.php,会发现showGlobal里的$vars是显示不出来的,global失效了?

2.PHP全局变量不能生效错误原因

搜索后发现,php.net上很早就有人提出过,也有人给出了解释:
原来,在t1.php的run函数中include func.php时,func.php中的变量$vars的作用域只是在run之内,而在showGlobal中使用global声明的$vars是要求属于t1.php的不是run函数的,所以为空)

3.PHP全局变量不能生效解决方法

知道原因后,解决就很简单,可以把include 从run中移出来,这样,func.php中的$vars就属于t1.php了;也可以在run里用global声明一下$vars,这样也可以把原来属于run的$vars声明为全局(属于t1.php);

虽然问题可以简决,但用起来还是很不爽, 因为在我的phpec框架中,include的情况比较普遍,不可能把view中按需include的移到外层去,使用global的话,我在使用第三方函数时,又不会也不想去了解它用了什么全局变量,而且,层次结构一多,就….

PHP全局变量不能生效的原因总结:

1)尽量减少多级和函数中include文件.

2)尽量不用全局变量

2013年3月11日星期一

nginx+cgi解析php容易出现的漏洞的分析

标题有点大,当我们仔细分析后,实际上一般都是配置问题。 

如果有人想攻击服务器时,都会扫描机器哪里有漏洞可以上传恶意脚本文件,上传脚本是第一步,
当恶意的php脚本被上传到服务器时(其后缀可能是php,也可能伪装如jpg等其它后缀),
如果该脚本能被解析执行,那想攻击者就可以为所欲为了。
那从源头上来避免这个问题可以从如下两方面入手:
1.上传前就应该判断文件不能是php脚本文件,如果是不能允许其上传(包括伪装后缀的)。
2.上传后就应该把上传的附件文件单独放在一个服务器,该机器只做静态解析,就没什么问题了。
第一条需要写程序保证,没什么说的,最简单的判断文件后缀,到file判断文件类型,或者再复杂的,大家可以去网上找。
第二条解决起来可能碍于资源有限,也不好办。那如果没条件只有一台机器的话,是不是只能人为刀俎,我为鱼肉了呢。
其实也可以从配置上去避免,
禁止ngingx解析上传目录中的php文件。
location ~* ^/upload/.*\.(php|php5)($|/)
{
    deny all;
}
避免伪装其它后缀的脚本执行
比如: 通过某种方法上传了伪装文件,upload下存在一个伪装成图片的php脚本a.jpg,
那么当使用http://www.nginx.cn/upload/a.jpg/b.php访问时,
如果不做特殊设置传给CGI执行的SCRIPT_FILENAME就是$root/upload/a.jpg/b.php
当设置了cgi.fix_pathinfo = 1时,PHP就会以'/'为分割符从最后一个文件开始向前找存在的文件去执行。
$root/upload/a.jpg/b.php
$root/upload/a.jpg
最终伪装脚本将会被执行。
解决方法:
1.关闭cgi.fix_pathinfo 设置成 cgi.fix_pathinfo = 0,但是会影响使用PATH_INFO进行rewrite的程序。
2.
 
代码如下:
 
location ~* .*\.php($|/)
{
if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 403;
}
}

2013年2月10日星期日

神贴啊。。。


招商银行白金信用卡分为经典版和精致版。

年费:
经典版主卡3600元/年,附属卡2000元/年。主卡可用10000积分兑换3600元年费,附属卡可用5000积分兑换2000元年费。
精致版主卡800元/年,附属卡300元/年。一年刷卡80000元免年费。
招行刷卡20元积1分,但是未必经典版的条件更高,因为招行经常有一些积分翻倍活动。
精致版的80000元消费包括无积分消费,如淘宝。
经典版赠送贵宾待遇,而精致版需要积分兑换这些贵宾待遇,
综合考虑,我选择了经典版。

成本分析(1张主卡+1张附属卡):
1. 按名义年费:5600元/年。不考虑。
2. 按最大成本获得15000积分:取现30万(2000元/次x150次),手续费3000元,1天的利息150元,合计3150元。
3. 招行有一些积分翻倍活动,加上平时刷卡,所以成本一定小于3150元,为了卡友利益,不便详述。
4. 按积分价值(机会成本):按20积分=1元。虽然兑换DQ冰激凌15:1,多样屋(感觉比较贵)15:1,看电影15:1等,最当钱用的是百盛购物25:1。招行20:1与他行400:1的价值是基本相当的。他行积分兑换超市购物卡,手机充值卡一般需要500:1。15000积分相当于750元。
5. 按积分价值(机会成本):按15积分=1元。有些朋友喜欢DQ、电影、多样屋,或是里程兑换合理,可以用到15:1,15000积分相当于1000元。
所以成本按1000元,方法对头,不怕麻烦,会更少。

贵宾待遇:
1. 体检:按350元/人次x2人,合计700元,下详述。精致版可用7000积分兑换1次。
2. 洗牙:按150元/人次x2人,合计300元,下详述。精致版可用3000积分兑换1次。
3. 三甲医院预约挂号:按100元/人次x1次,合计100元,下详述。精致版可用2000积分兑换1次。
4. 机场贵宾厅:按100元/人次x4次,合计400元,下详述。精致版可用3000积分或150元兑换1次(这也说明了积分20:1的合理性)。
5. 航空意外险:1500万,按100元,下详述。
6. 旅行不便险。
7. 生日当天消费积分10倍。订酒店积分10倍。
8. 额度较高,5+X万。
9. 在银行不用排队。
10. 客服电话直接转人工,不需输入卡号密码选择键。
其它一些我用不上,如高尔夫、租车等。综合起来,办白金卡还是值得的。唯一不确定的是是否年费兑换标准会不会提高,积分活动会不会变少或有限制。

体检:
招行办卡的业务员介绍的是美兆,说机器比较新。KVSKY兄推荐了望族国宾。因为当时自己已经预约了美兆,而且考虑到美兆是对体检者作档案的,可以前后对比,所以就决定在美兆进行初次体验。4月初预约的,因为我们只有周末有空,而周末人又比较多,所以约在了4周以后的周末。

美兆在北京、台湾、香港、马来西亚都有分店,上海店是2009年5月刚成立的。总体而言,作为专业的健检机构,美兆在环境、设备和服务态度上都很不错,比在公立医院的感受要好。只是价格很贵,如果自费的话,我还是会选择公立医院。

据招行的业务员介绍,体检价值1000元,当然,招行与美兆谈的价格一定没这么高,按照招行一些积分兑换礼品的价值,我们自购的价格可能是招行标注“市场价”的一半,所以我本来认为价值约500元,后来进行进一步的比较,认为该价格还会再低一些。

美兆实行会员制,“成人综合健检”115项,首次需交4000元,其中2000元为入会费,另2000元可以得到原价4000元的该套餐,以后每次体检2000元,我们可以认为,该套餐为2000元。美兆也有1000元的“至亲体检礼卡”和2000元的“至爱体检礼卡”,我们属于招商银行在美兆的团体会员。在淘宝可以找到美兆的体检产品,但都是上述的1000元与2000元,好像其价格是坚挺的。但是慈铭的体检卡可以5折在淘宝买到。回到美兆,2000元套餐的项目与我们招行套餐相差较多,不便比较。

比较一:1000元的“至亲”与招行套餐:“至亲”比招行多这几项:血脂检查中的高密度脂蛋白-胆固醇、低密度脂蛋白-胆固醇、CHOL/HDL-C比值,肝炎筛检中的乙肝表面抗原、乙肝表面抗体,癌症筛检中的甲胎蛋白、癌胚抗原,以及眼压、血氧饱和度等。

比较二:华山医院400元的团体体检项目,在其他项目与招行套餐基本一致的情况下,多了癌症筛检中的甲胎蛋白、癌胚抗原。

如果加100元选择招行的“男性套餐”,会增加心肌功能检查的肌酸激酶,血脂检查的高密度脂蛋白-胆固醇、低密度脂蛋白-胆固醇、CHOL/HDL-C比值。

从网上搜索的资料看,甲胎蛋白和癌胚抗原的定性检查价格约20-30元,定量检查约80-90元。姑且认为华山医院是定量的,那么扣除该2项的价格为320元,而因为是团体体检会有优惠,如果是个人,可能价格会略高些。再因为美兆的价格本来就比公立医院贵些,所以我推论,招行体检的使用价值差不多为350元。

不过,刚才看到,望族国宾的体检项目包含乙肝两对半以及甲胎蛋白、癌胚抗原。可以考虑明年去那体验一下。在淘宝上,国宾类似的套餐,价值600元,250元可以买到。

参考资料:

华山医院:http://www.huashan.org.cn/tijian.htm

39健康网:三甲医院体检价格(不过找到是深圳的,做为参考):http://sz.39.net/jktj/081/24/236229.html

洗牙:

4月初预约,也是只有周末有空,但周末人很多,约在4周后的5月8日,瑞尔齿科新天地店,后来新天地点排满了,要到6月,就改在5月22日的正大广场店。

约在下午2点,因为某些原因,2点50才到,偏偏手机还忘记带了,人家打我2次电话没打通。到了那里,拍了X光,但是说洗牙还不及了。因为医生3点、4点的预约都满了。老婆的医生5点有空,而我要下次再约时间。我们在商场逛了一会,后来,我的医生结束比较早,5点的时候打我老婆电话让我可以去。

洗牙时间约12分钟。以前在徐家汇的仁爱医院和长宁区中心医院洗过,仁爱医院200元,长中心100元。时间上长中心感觉和瑞尔差不多,印象中仁爱25分钟左右(仁爱洗牙的医生都是年轻的MM,长的不错,也挺温柔的)。可能在仁爱是第一次洗牙,比较费时间。在瑞尔,可能没有在约定时间去,所以时间被压缩了。但是起先医生建议改天时说,要么改天,要么马虎一点洗一下,但是马虎地洗没什么意思,所以后来洗的12分钟应该就算不马虎了吧。。

在瑞尔的价格单上,挂号费100元(只收一次),洗牙(瑞尔叫洁治)400元,拍X片200元,抛光300元。那天刚好有人在前台咨询,洗牙的初次费用是500元(400洗牙+100挂号),以后再洗就是400.我问了有没有折扣,回答是招行白金客户85折。而在淘宝,瑞尔价值800元的2次洗牙卡,120元就可以买到。在大众评论网上看到,有人也是网上买的折价卡,洗了45分钟,莫非我有人品问题?

综上,根据本次的体验,我觉得招行在瑞尔洗牙的使用价值差不多为150元。

三甲医院预约挂号:

每卡每年最多3次,2张卡为6次,但一般不会用那么多,只按1次计。

机场贵宾厅:

每卡每年最多6次,2张卡为12次。其实在大厅候机也没什么不好,所以实际使用次数及价值均按较低值。使用建行PP卡去国内机场贵宾厅的费用是16.50美元,国际机场(如浦东、港澳)要19.75美元。

交通意外险:

飞机1500万,火车轮船地铁100万,汽车40万,但是要求信用卡购票。平安保险1个月的交通意外险,20元保100万飞机,50万火车,5万汽车。保1年的费用是100元。考虑到平安不限制信用卡购票,其保障范围宽很多;另一方面,1500万与100万对于家人的意义是差不多的,只是安排身后事而已,对家人再尽一点照顾。不过,相信没人希望获赔。

旅行不便险:

我觉得这个险种挺好,但是要求延误4小时以上才能获赔(500-2000元)。而我遇到的,都是延误2-3小时。

里程兑换:

里程兑换是招行白金卡的一个亮点,比兑换礼品更实用。一方面,招行时常有一些积分活动,另一方面,招行白金卡折算消费额与里程的兑换比例是15:1,这在信用卡中是比较高的。当然,有些联名信用卡的比例也有15:1-18:1的,但是那是定向的航空公司。用普卡或金卡对非定向的航空公司兑换,一般是18:1-20:1。也有些商旅类的白金卡,兑换比例可达6:1,但是年费标准比招行高。我觉得可以尝试的是交行东航卡,是12:1。

最近(2010年5月),招行调高了兑换标准,15:1是新的标准,即1500积分兑换2000里程,之前是1200积分兑换2000里程。11000里程可以兑换800公里x往返的机票的。当然,平时的机票是可以打折的,我们不能都按原价比。我们要选择在节日期间兑换,这样使用价值更高,或者选择一些不太打折的航线,比如我发现上海去黄山和九寨沟基本不打折。还有,尽量选择远程的,尽量选择往返票。

国内航空公司免费机票兑换所需里程(经济舱往返程):
(因为字数限制,编辑的内容只能放在第27楼了,用了20多个小时,相信是有用的,请关注!)

比较特殊的旅行地:
九寨沟:国航兑换其它地方不占优势,但是飞九寨沟只有国航的航班,32000里程兑换往返程。如果用上航积分兑换国航机票则需要40000里程。
香港:只有东航和海航是按与国内城市一样算距离,均为26000里程兑换。但是从上海出发只有东航和上航的航班。

我推荐的几个地方(上海出发),按折扣票的性价比依次为(折扣价参照携程查询结果):
九寨沟:4320元,32000里程,135元/千公里;
威海,1400元,11000里程,127元/千公里;
黄山:1160元,11000里程,105元/千公里;
拉萨:2740元,32000里程,86元/千公里;
丽江:2680元,32000里程,84元/千公里;
武夷山:920元,11000里程,84元/千公里;
西双版纳:2480元,32000里程,78元/千公里;
西宁:1860元,25000里程,74元/千公里;
乌鲁木齐:2120元,35000里程,61元/千公里;
深圳:1180元,22000里程,59元/千公里;
北京:1100元,22000里程,55元/千公里;
成都:1220元,25000里程,49元/千公里。
当然,我查到的未必是最低价,而且,会有很多好的地点没有包括在内。大家评价的方法是:根据不同航空公司的里程兑换标准,以及在一段时间内的机票价格和自己的时间,来判断兑换的性价比。

国内航空公司免费机票兑换所需里程(经济舱往返程): 
上海航空南方航空 东方航空中国航空 海南航空
<600 km 11000 1200015000 1500014000
601-800 km11000 12000 2200022000 14000
801-1100 km 2200020000 22000 2200020000
1101-1200 km 2200020000 22000 2600020000
1201-1400 km 2200020000 26000 2600023000
1401-1500 km25000 20000 2600026000 23000
1501-1600 km 2500020000 26000 3200023000
1601-1700 km25000 20000 2600032000 26000
1701-1800 km 25000 3000026000 3200026000
1801-2000 km25000 30000 3500032000 26000
2001-2200 km 3200030000 35000 3600032000
2201-2500 km32000 30000 3500036000 32000
2501-3000 km 3200030000 35000 3600032000
>3000 km52000 6000035000 36000 50000
上海-港澳(1700km) 3600050000 26000 5000026000