我的第一次买房经历与经验

一、看房定房
 
经历:
 
  • 2.26通过房天下看回龙观房子,看了一套,感觉不合适
  • 2.27通过链家看天通苑的房子,看了一天四套。看中后当天约业主签定金合同,交部分定金
经验:
 
  1. 购房资格:对于非北京户口的情况,之前以为必须连续每月的缴社保满5年才有资格。后来才知道除了可通过缴社保外,也可以通过缴税获得购房资格,而且缴税相对宽松一些,只要连续缴税5年,不是连续60个月,即每年缴1次即可。一定要先确保有资格,要不查出没购房资格,白折腾还浪费钱。
  2. 中介:几百万的交易,最好找大的中介,虽然贵点,但是放心很多。比如链家,目前最大。
  3. 看房看什么:有的人喜欢多看几家多对比,我个人感觉不一定非得看好几个月再决定,看到合适的,该出手时就出手。看房看什么应该比较清楚了,交通、医院、商场、菜市场、小区环境、是否临街、孩子上学、房子装修、房屋年龄、商品房还是经济适用房、满五还是满二、是否唯一等等。
  4. 商品房还是经适房:其实这个无所谓了,因为同样的房子,商品房的售价肯定比经适房贵。贵的部分基本就是经转商的钱。如果买的是经适房,缴税过户后就转为了商品房。
  5. 费用构成:中介费(给中介)+房屋售价(给业主)+税费(给国家)。中介费:链家服务费市场价是房屋售价的2.7%,可以砍到2.6%,目前腾讯员工可以享受2.5%。房屋售价:看市场状态,如果是卖方市场,业主不涨价就谢天谢地了,如果是买方市场,听说可以看情况砍2万左右,当然不管怎么样,还是得砍一下的,万一能砍点呢。税费:最爽的是满五唯一商品房,可参考 http://dwz.cn/36NweB
  6. 满评的坑:这些税费都可以让中介帮忙计算的。一般会按照满评计算,但实际上不一定能满评,所以不一定能贷到房屋售价的7成,那你的首付就多了。所以可以问下满评的几率多大,如果只评到房屋售价的9成,要提前考虑下承受能力。
  7. 签定金合同:觉得房子合适,价格合适,就约业主签定金合同,金额一般在1w-10w不等,违约双倍赔偿。如果可以,直接签购房合同也行。另外,贷款方式也需要沟通好,是公积金贷款还是商贷还是组合贷,商贷最快(最多贷房屋评估金额的7成)、公积金较慢(最多贷120w)、组合贷据说业主都不考虑因为太慢太慢。
 
二、购房合同
 
经历:
 
  • 3.1签买卖合同,又交定金,并交中介费、房屋评估费
经验:
 
  1. 再次确认:签之前最好再次明确自己是否有购房资格,非北京户口的,可以去地税局查询自己最近5年的缴税证明,或者去社保处查询自己的社保记录。除此之外,最好去指定的可以打印征信记录的银行(http://dwz.cn/36NuVD)打印自己的征信记录,以确保有贷款资格,一般近5年内超过3次信用卡逾期记录可能就会有问题。总之目的就是确保后续的流程万无一失,即便有问题,在签购房合同前发现问题,也可以把损失降到最低。
  2. 准备的材料:都是夫妻双方的原件,包括身份证、暂住证(如果没有找中介帮忙办)、户口本、结婚证。这些材料建议用档案袋统一装着,每次和中介见面时都带着。
  3. 材料的坑:上述材料的信息准确性在前面几个环节没那么重要,但在后续过户的环节要非常准确,比如暂住证是否在有效期内、身份证是否在有效期、户口本上的结婚状态是否已婚、户口本的家庭地址与身份证的地址是否完全一样。如果与实际情况不符合,最好在过户前办好。
  4. 签合同注意:一是确定网签面签、缴税过户、物业交割的时间点。二是确认物业交割时哪些东西是要留下来的,这个可以和业主商量。其他的就是疯狂的签名就可以了。(夫妻一人到即可)
  5. 缴费:此时交中介费,并交更多的定金。另外,还需要交几百块的房屋评估费。一般可以先少交一万定金,当作物业保证金,待最后物业交割后再给业主。
 
三、面签贷款
 
经历:
 
  • 3.23面签,申请贷款
  • 4.11批贷
经验:
 
  1. 房屋价值与购房资格:签订购房合同后,中介会请评估公司评估房屋的价值,这决定了能贷多少钱,即前面讲到的满评问题。另外贷款金额也和银行有关系,有的银行愿意给满评有的不愿意。同事中介也会把买方夫妻双方的身份证明上传到购房资格审查系统以评定是否有购房资格。
  2. 网签面签:等评估结果和购房资格结果出来后,中介会帮忙提交网签,网签后,安排面签(链家的面签地在总部,建国门附近)。面签时会安排银行签贷款申请。(夫妻两人到)
  3. 贷款材料:除了上述签合同时的材料,还需要打印近一年银行工资流水、公司开具的收入证明(链家提供模板)、公司营业执照复印件加盖公司公章。如果借款人的月工资大于月供的2倍则上述材料只需要一个人的,否则需要夫妻双方的。
  4. 签贷款申请时,会告诉你可贷金额、利率折扣,各项费用都可以准确计算出来了,可以开始准备钱了。一般其实可以先不交首付,等到批贷后再交,几十几百万的,多在自己手里放几天,利息都不少呢。
  5. 面签的地方人山人海,早去早排队。
 
四、首付缴税过户收房
 
经历:
 
  • 4.12交首付
  • 4.13缴税,过户,出房本
  • 5.15拿房本
  • 8.16收房
经验:
 
  1. 配合批贷:保持手机畅通,在银行批贷过程中遇到问题会电话联系你,哪怕是非工作时间。另外,申请贷款前,确保自己没有贷款、没有或较少信用卡逾期,比如借了微粒贷、京东金条、支付宝借呗、P2P借款等。批贷后你可以再借微粒贷。信用卡账期内有消费记录不影响。
  2. 微粒贷的坑:微粒贷的借款记录会出现在征信记录里,而且把可借款额度表述得不准确,银行一般会理解成已欠款额度。可以提前联系微粒贷客服,帮忙出具一份证明自己的微粒贷没有欠款的证明。(深圳寄出,3天到京)。把这份证明提前给原件或扫描复印件给银行即可。
  3. 批贷后,和中介、业主约时间,交首付,进行资金监管。钱打给链家,业主可以看到这笔钱到了托管账户,但是无法取出。
  4. 和中介、业主约时间,带齐材料,到地税局缴税。如果商贷最好周三去,因为周二、四受理公积金人更多。有的甚至需要提前一周排号、甚至买号。缴税的地方人山人海,早去早排队。
  5. 和中介、业主约时间,带齐材料,到建委过户。过户时会出购房人的房本,但是房本原件会被中介带走给银行,暂时不会给你,只会给你复印件。过户的地方人山人海,早去早排队。
  6. 银行收到房本后,会在房本上盖章表示此房目前有抵押。然后把房本原件、为业主提供的有贷款金额的银行卡、为你提供的银行卡等给中介。中介把房本给买方,把有贷款金额的银行卡、托管账户的钱给业主。至此房子法律意义上就是你的了。
  7. 按照购房合同约定的时间交割物业。请中介帮忙一起查收房子。主要看约定的家具电器等是否留下,房子是否有漏水等情况,是否有物业费、水电气费等欠款等。没问题后给业主支付物业保证金。

js控制文本框只能输入中文、英文、数字与指定特殊符号

JS 控制文本框只能输入数字
<inputonkeyup=”value=value.replace(/[^0-9]/g,”)” type=”text” />

JS 控制文本框只能输入数字、小数点
< inputonkeyup=”value=value.replace(/[^\0-9\.]/g,”)” onpaste=”value=value.replace(/[^\0-9\.]/g,”)” oncontextmenu =”value=value.replace(/[^\0-9\.]/g,”)” >

JS 控制文本框只能输入英文
< inputonkeyup=”value=value.replace(/[^\a-\z\A-\Z]/g,”)”onpaste=”value=value.replace(/[^\a-\z\A-\Z]/g,”)” oncontextmenu =”value=value.replace(/[^\a-\z\A-\Z]/g,”)”>

JS 控制文本框只能输入英文、数字
< inputonkeyup=”value=value.replace(/[^\a-\z\A-\Z0-9]/g,”)”onpaste=”value=value.replace(/[^\a-\z\A-\Z0-9]/g,”)” oncontextmenu=”value=value.replace(/[^\a-\z\A-\Z0-9]/g,”)”>

JS 控制文本框只能输入中文
< inputonkeyup=”value=value.replace(/[^\u4E00-\u9FA5]/g,”)”onpaste=”value=value.replace(/[^\u4E00-\u9FA5]/g,”)” oncontextmenu=”value=value.replace(/[^\u4E00-\u9FA5]/g,”)”>

JS 控制文本框只能输入中文、英文、数字
< inputonkeyup=”value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/g,”)”onpaste=”value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/g,”)”oncontextmenu =”value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/g,”)”>

JS 控制文本框只能输入中文、英文、数字、空格
< inputonkeyup=”value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\]/g,”)”onpaste=”value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\]/g,”)” oncontextmenu =”value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\]/g,”)”>

JS 控制文本框只能输入中文、英文、数字、小数点
< inputonkeyup=”value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\.]/g,”)”onpaste=”value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\.]/g,”)”oncontextmenu =”value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\.]/g,”)”>

总而言之:

先在'<inputtype=”text” />’里输入 onkeyup=”value=value.replace(/[^\X]/g,”)”

然后在(/[\X]/g,”)里的 X换成你想输入的代码就可以了,

中文u4E00-u9FA5,数字0-9,英文a-z\A-Z,其它符号@、点或其它符号。

也可以多个,用\隔开就行了。
例如:中英文 + 数字 + @符号 + 点符号 \a-\z\A-\Z0-9\u4E00-\u9FA5\@\.

若想在文本框里不能右键弹出菜单和不能粘贴进复制的信息的话

就要在'<inputtype=”text” />’里输入onpaste=”return false” oncontextmenu=”return false;”

PHP验证身份证号码

身份证号码的结构
身份证号码是特征组合码,由17位数字本体码和一位校验码组成。
排列顺序从左至右依此为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

地址码(前六位数)
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

出生日期码(第七位至十四位)
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

顺序码(第十五位至十七位)
表示在同一地址码所标识的区域范围,对同年、同月、同日出生的人编定的顺序号,顺序码奇数分配给男性,偶数分配给女性。

校验码(第十八位数)
1.十七位数字本体码加权求和公式
S= SUM(Ai * Wi), i=0, … , 16, 先对前17位数字的权求和。
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

2. 计算模
Y = mod(S, 11)

3.通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2

验证身份证号码方法:

<?php
function checkIdCard($idcard){

    // 只能是18位
    if(strlen($idcard)!=18){
        return false;
    }

    // 取出本体码
    $idcard_base = substr($idcard, 0, 17);

    // 取出校验码
    $verify_code = substr($idcard, 17, 1);

    // 加权因子
    $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

    // 校验码对应值
    $verify_code_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

    // 根据前17位计算校验码
    $total = 0;
    for($i=0; $i<17; $i++){
        $total += substr($idcard_base, $i, 1)*$factor[$i];
    }

    // 取模
    $mod = $total % 11;

    // 比较校验码
    if($verify_code == $verify_code_list[$mod]){
        return true;
    }else{
        return false;
    }

}


$idcard = '这里填写要验证的身份证号码';
var_dump(checkIdCard($idcard));
?>

Linux添加FTP用户并设置权限

在linux中添加ftp用户,并设置相应的权限,操作步骤如下:

1、环境:ftp为vsftp。被限制用户名为test。被限制路径为/home/test

2、建用户,命令行状态下,在root用户下:
运行命令:“useradd -d /home/test test”  //增加用户test,并制定test用户的主目录为/home/test
运行命令:“passwd test”  //为test设置密码,运行后输入两次相同密码

3、更改用户相应的权限设置:
运行命令:“usermod -s /sbin/nologin test”  //限定用户test不能telnet,只能ftp
运行命令:“usermod -s /sbin/bash test”  //用户test恢复正常
运行命令:“usermod -d /test test”  //更改用户test的主目录为/test

4、限制用户只能访问/home/test,不能访问其他路径
修改/etc/vsftpd/vsftpd.conf如下:
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list

编辑上面的内容

第一行:chroot_list_enable=YES  //限制访问自身目录
第三行:编辑chroot_list。根据第三行说指定的目录,找到chroot_list文件。(因主机不同,文件名也许略有不同)
编辑chroot_list,将受限制的用户添加进去,每个用户名一行

5、重启服务器
改完配置文件,不要忘记重启vsFTPd服务器
运行命令:/etc/init.d/vsftpd restart

6、如果需要允许用户修改密码,但是又没有telnet登录系统的权限:
运行命令:“usermod -s /usr/bin/passwd test”  //用户telnet后将直接进入改密界面

PHP的网站主要攻击方式有哪些?

1、命令注入(Command Injection)

2、eval注入(Eval Injection)

3、客户端脚本攻击(Script Insertion)

4、跨网站脚本攻击(Cross Site Scripting, XSS)
http://www.cnblogs.com/bangerlee/archive/2013/04/06/3002142.html

5、SQL注入攻击(SQL injection)

6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

7、Session 会话劫持(Session Hijacking)

8、Session 固定攻击(Session Fixation)

9、HTTP响应拆分攻击(HTTP Response Splitting)

10、文件上传漏洞(File Upload Attack)

11、目录穿越漏洞(Directory Traversal)

12、远程文件包含攻击(Remote Inclusion)

13、动态函数注入攻击(Dynamic Variable Evaluation)

14、URL攻击(URL attack)

15、表单提交欺骗攻击(Spoofed Form Submissions)

16、HTTP请求欺骗攻击(Spoofed HTTP Requests)

怎么构建高性能WEB站点

1.时间都花在哪里了:

(1)数据在网络上的传输时间。

(2)服务端处理请求,并生成返回数据的时间。

(3)浏览器本地计算与渲染的时间。

2.瓶颈在哪里,找到问题的本质及原理?

3.调优方案:

(1)增加带宽。

(2)减少网页中的HTTP请求。

(3)加快服务端脚本的计算速度(解析器优化)。

(4)动态内容缓存。

(5)数据缓存。

(6)动态内容静态化。

(7)web服务器软件的选择与配置。

(8)服务器资源的分开部署,CDN加速。

(9)集群与负载均衡。

(10)数据库优化:

【1】连接池

【2】表结构,索引(explain、慢查询日志)

【3】合理选择数据库引擎

【4】海量数据时,考虑垂直切割数据库,增加冗余并分散数据存放。

(11)增加资源来提高性能。

4.优化产品体验减少等待的感觉。

PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询

目前的工作是需要对用户的一些数据进行分析,每个用户都有若干条记录,每条记录中有用户的一个位置,是用经度和纬度表示的。
还有一个给定的数据库,存储的是一些已知地点以及他们的经纬度,内有43W多条的数据。
现在需要拿用户的经纬度和已知地点进行距离匹配,如果它们之间的距离小于一定的数据,比如说500米,就认为用户是在这个地点。
MYSQL本身是支持空间索引的,但是在5.x的版本中,取消了对Distance()和Related()的支持,参考这里:MySQL 5.1参考手册 :: 19. 中的空间扩展 19.5.6. 测试几何类之间空间关系的函数,无法使用空间的距离函数去直接去查询距离在一定范围内的点。所以,我首先想到的是,对每条记录,去进行遍历,跟数据库中的每一个点进行距离计算,当距离小于500米时,认为匹配。这样做确实能够得到结果,但是效率极其低下,因为每条记录都要去循环匹配40W条数据,其消耗的时间可想而知。经过记录,发现每条记录处理的时间消耗达到1700ms,针对每天上亿的数据量,这样一个处理速度,让人情何以堪啊。。。
我自己也有个想法,就是找到每条记录所在点的经纬度周围的一个大概范围,比方说正方形的四个点,然后使用mysql的空间计算,使用MBR去得出点在这个矩形内的已知记录,然后进行匹配。可惜,自己没想出能计算到四个点经纬度的方法。
意外的,查询到了一个关于这个计算附近地点搜索初探,里面使用python实现了这个想法。
所以参考了一下原文中的算法,使用PHP进行了实现。实现原理也是很相似的,先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。

20120615-php-mysql-earth-distance-map

参考wiki百科上的一些球面计算公式:

假设已知点的经纬度分别为$lng, $lat
先实现经度范围的查询,
在haversin公式中令φ1 = φ2,可得:

20120615-haversin-distance-lng

PHP进行计算,就是:

//$lat 已知点的纬度
$dlng = 2 * asin(sin($distance / (2 * EARTH_RADIUS)) / cos(deg2rad($lat)));
$dlng = rad2deg($dlng);//转换弧度

然后是纬度范围的查询,
在haversin公式中令 Δλ = 0,可得

20120615-haversin-distance-lat

在PHP中进行计算,就是:

$dlat = $distance/EARTH_RADIUS;//EARTH_RADIUS地球半径
$dlat = rad2deg($dlat);//转换弧度

最后,就可以得出四个点的坐标:
left-top : (lat + dlat, lng – dlng)
right-top : (lat + dlat, lng + dlng)
left-bottom : (lat – dlat, lng – dlng)
right-bottom: (lat – dlat, lng + dlng)

我把以上方法写成了一个函数,综合起来就是:

 define(EARTH_RADIUS, 6371);//地球半径,平均半径为6371km
 /**
 *计算某个经纬度的周围某段距离的正方形的四个点
 *
 *@param lng float 经度
 *@param lat float 纬度
 *@param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米
 *@return array 正方形的四个点的经纬度坐标
 */
 function returnSquarePoint($lng, $lat,$distance = 0.5){
	$dlng =  2 * asin(sin($distance / (2 * EARTH_RADIUS)) / cos(deg2rad($lat)));
	$dlng = rad2deg($dlng);
	$dlat = $distance/EARTH_RADIUS;
	$dlat = rad2deg($dlat);
	return array(
	   'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),
	   'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),
	   'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),
	   'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)
	);
 }
//使用此函数计算得到结果后,带入sql查询。
$squares = returnSquarePoint($lng, $lat);
$info_sql = "select id,locateinfo,lat,lng from `lbs_info` where lat<>0 and lat>{$squares['right-bottom']['lat']} and lat<{$squares['left-top']['lat']} and lng>{$squares['left-top']['lng']} and lng<{$squares['right-bottom']['lng']} ";

在lat和lng上建立一个联合索引后,使用此项查询,每条记录的查询消耗平均为0.8毫秒,相比以前的1700ms,真的是天壤之别啊。效率真真的是以前的2125倍~~

总结:这应该也不是效率最好的办法,但是效率比以前确实有明显的提升。请记住,总有办法更好的。

转自 http://digdeeply.org/archives/06152067.html

MySql如何一次更新多条数据(不建议使用UPDATE语句)

我们知道当插入多条数据的时候insert支持多条语句:

INSERT INTO t_member (id, name, email) VALUES
    (1, 'nick', 'nick@126.com'),
    (4, 'angel','angel@163.com'),
    (7, 'brank','ba198@126.com');

但是对于更新记录,由于update语法不支持一次更新多条记录,只能一条一条执行:

UPDATE t_member SET name='nick', email='nick@126.com' WHERE id=1;
UPDATE t_member SET name='angel', email='angel@163.com' WHERE id=4;
UPDATE t_member SET name='brank', email='ba198@126.com' WHERE id=7;

这里问题就出现了,倘若这个update list非常大时(譬如说5000条),这个执行率可想而知。

这就要介绍一下在MySql中INSERT语法具有一个条件DUPLICATE KEY UPDATE,这个语法和适合用在需要判断记录是否存在,不存在则插入存在则更新的记录。

具体的语法可以参见:http://dev.mysql.com/doc/refman/5.0/en/insert.html

基于上面这种情况,针对更新记录,仍然使用insert语句,不过限制主键重复时,更新字段。如下:

INSERT INTO t_member (id, name, email) VALUES
    (1, 'nick', 'nick@126.com'),
    (4, 'angel','angel@163.com'),
    (7, 'brank','ba198@126.com')
ON DUPLICATE KEY UPDATE name=VALUES(name), email=VALUES(email);

注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法!

原文地址:MySql更新多条数据不建议使用UPDATE语句, 感谢原作者分享。

Cookie禁用了,Session还能用吗?

Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。

是不是Cookie让禁用了,Session就一定不能用了呢?在PHP中,通过相关的配置,可以让Session不依赖Cookie而存在。这是因为:

Session,储存于服务器端(默认以文件方式存储Session),根据客户端提供的Session ID来得到用户的文件,取得变量的值,Session ID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……。也就是说,Session ID是取得存储在服务上的Session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个Session文件,随之也产生了与之唯一对应的一个Session ID,定义Session变量以一定形式存储在刚才产生的Session文件中。通过Session ID,可以取出定义的变量。跨页后,为了使用Session,你必须又执行session_start();将又会产生一个Session文件,与之对应产生相应的Session ID,用这个session id是取不出前面提到的第一个Session文件中的变量的,因为这个Session ID不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的Session文件,直接读取与这个id对应的Session文件。

PHP中的Session在默认情况下是使用客户端的Cookie来保存Session ID的,所以当客户端的cookie出现问题的时候就会影响Session了。必须注意的是:Session不一定必须依赖Cookie,这也是Session相比Cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把Session ID附着在URL中,这样再通过Session ID就能跨页使用Session变量了。但这种附着也是有一定条件的,即“php.ini中的session.use_trans_sid = 1“,或者编译时打开打开了“–enable-trans-sid”选项。

用过论坛的朋友都知道,在进入论坛的时候,往往会提示你检查Cookie是否打开,这是因为大多数论坛都是基于Cookie的,论坛用它来保存用户名、密码等用户信息,方便使用。而且很多朋友都认为Cookie不安全(其实不是这样),往往禁用它。其实在PHP程序中,我们完全可以用Session来代替Cookie,它可以不依赖于客户端是否开启Cookie。

所以,我们可以抛开Cookie使用Session,即假定用户关闭Cookie的情况下使用Session,其实现途径有以下几种:

1. 设置php.ini配置文件中的“session.use_trans_sid = 1”,或者编译时打开打开了“–enable-trans-sid”选项,让PHP自动跨页传递Session ID。
2. 手动通过URL传值、隐藏表单传递Session ID。
3. 用文件、数据库等形式保存Session ID,在跨页过程中手动调用。

PHP模拟QQ登录,发送和接收信息

<?php
header(‘Content-type: text/html; charset=utf-8’);
$sid = qqLogin(‘发送信息的QQ’,’发送信息的QQ密码’);   //登录帐号
sendMsg($sid,’接收信息的QQ’,’聊天内容’);            //发送消息

$data = getMsg($sid,’接收信息的QQ’);               //获取和某个帐号的聊天记录

if(!empty($data)){
foreach($data as $v){
echo $v[‘title’].'<br />’;
echo $v[‘msg’].'<br />’;
echo ‘————————<br />’;
}
}

function qqLogin($qq_num,$qq_pwd){                //登录帐号
$data = httpGet(‘http://pt.3g.qq.com/’);
$action = preg_match(“/action=\”(.+)?\”/”, $data, $matches);
$action = $matches[1];
$params = array();
$params[“login_url”] = ‘http://pt.3g.qq.com/s?aid=nLogin’;
$params[“sidtype”] = 1;
$params[“loginTitle”] = ‘手机腾讯网’;
$params[“bid”] = 0;
$params[“qq”] = $qq_num;
$params[“pwd”] = $qq_pwd;
$params[“loginType”] =1;
$data = httpPost($action, $params,1);
$action = preg_match(“/sid=(.+?)&/”, $data, $matches);
$sid = $matches[1];
if($sid){
return $sid;
}else {
echo ‘登录失败’;
}
}

function sendMsg($sid,$to_num,$msg){            //发送消息
$params = array();
$params[“msg”] = $msg;
$params[“u”] = $to_num;
$params[“saveURL”] = 0;
$params[“do”] = “send”;
$params[“on”] = 1;
$params[“aid”] = “发送”;
$url = “http://q16.3g.qq.com/g/s?sid=” . $sid;
$data = httpPost($url, $params);
if(preg_match(‘/消息发送成功/’,$data)) echo ‘发送成功<br />’;
else  echo ‘发送失败’;

}

function getMsg($sid,$qq_num) {                    //获取消息
$url = “http://q16.3g.qq.com/g/s?sid=” . $sid . “&u=” . $qq_num . “&saveURL=0&aid=nqqChat”;
$data = httpGet($url);
preg_match_all(‘/<div class=\”main-module bm-gray\”>\s+<p class=\”(?:ft-s-gray|ft-s ft-cl2)\”>(.+?)<\/p>\s+<p>(.+?)<\/p><\/div>/s’,str_replace(“\r\n”,””,$data),$m);
foreach($m[1] as $k=>$v){
$tmp[‘title’]=$v;
$tmp[‘msg’]=$m[2][$k];
$r[]=$tmp;
}
return $r;
}

function httpGet($url,$header=0){                //GET请求
$opt = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => $header,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 60,
CURLOPT_USERAGENT=>’Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13′
);
return curlRun($opt);
}

function httpPost($url,$data,$header=0){         //POST请求
$opt = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => $header,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 60,
CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_USERAGENT=>’Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13′
);
return curlRun($opt);
}

function curlRun($opt){
$ch = curl_init();
curl_setopt_array($ch,$opt);
$r = curl_exec($ch);
curl_close($ch);
return $r;
}

?>

通过微信公众帐号登录网站

PC端的微信、淘宝、微博都相继推出了通过客户端扫码登录,感觉很创新;我想了一个通过微信公众帐号登录雅酷网的流程,自己瞎想的,大家帮忙看看安全吗?可行吗?

1、用户在微信公众帐号绑定自己的微信和网站账户

2、用户在网站选择微信登录,后台记录页面一个cookie,并生成一个6位随机数

3、用户在网站的微信公众帐号发送“随机密码”,返回上面生成的随机数

4、用户在网站输入随机数,后台比对当面页面这个cookie和随机数,验证成功则登录成功

另外一种更简单的操作思路(更类似于扫码登录):

1、用户在微信公众帐号绑定自己的微信和网站账户

2、用户在网站选择微信登录,后台记录页面一个cookie,并生成一个6位随机数且显示给用户,同时不断监听后台

3、用户在网站的微信公众帐号发送上面生成的随机数,后台比对这个页面cookie和收到的随机数是否正确,正确则返回给PC端,PC端自动登录

微信扫描二维码登录网页版原理

CSC模式为:web客户端 –> 服务端(腾讯)

1、打开微信网页版,在浏览器生成一个web客户端,此客户端并未任务授权,但服务端给它生成了一个唯一标识码UUID,监听服务端登录请求;

2、手机客户端点击 [登录网页版] 时,实际上此时客户端是登录了且有访问授权码 access_token,扫描网页二维码,获得UUID,将access_token 与UUID编码后,传自腾讯服务端,服务端生成登录授权码,通知正在监听中的网页客户端;

3、网页客户端通过侦听器获得授权码,往服务器请求用户信息,完成登录过程。

来往网页版扫码自动登录的实现原理

1、每打开一次页面的时候会随机生成一个含有唯一ID的二维码;

2、当用户使用登陆后的来往扫描该二维码的时候,客户端会解析出二维码中的这个唯一ID会将这个id和手机上的来往账号及密码绑定,并上传到服务器;

3、来往网页版页面每隔1秒或2秒会get请求该id对应的来往账号及密码,如果id绑定上了来往账号和密码,那么就可以请求到账号和密码,就可以自动登录了。

4、这样实现的目的1.安全,用户不需要再次输出用户名密码,2.方便,用户不需要再次输出用户名密码.3.比如QQ与手机图片互传也是这样一个原理.

php读取同服务器中的php源代码

比如我有两个文件a.php,b.php。

a.php文件中的语句是:
<?php
echo “i am a.php”;
?>

现在,我需要在b.php文件显示文件a.php中的源代码,是源代码,如下:

<?php
$a_code = file_get_contents(‘a.php’);
echo htmlspecialchars($a_code);
?>

重点即在此htmlspecialchars()函数,htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。