利用单文本回复改善登录的安全性程序
前面提到,采用明传值的方法用于用户登录是很不安全的。如何才能把用户的OpenID传给自己的网站,而又让人看不到呢?form post的方法在微信上不可行,而微信推荐用的方法订阅号又没有权限。我们想了个办法,在收到用户发的一条短信后,随机生成一个字符串,把这个字符串和OpenID同时存在数据库的一个临时表里。把随机生成的这个字符串用明传值的方法传给下一程序。下一程序登录程序(loginwx.php)接收到这个字符串后,再到数据库中查OpenID。得到OpenID后,删掉这条记录。这个黑客能知道明传值的内容,也无法通过loginwx.php登录我们的网站。

事先在数据库中建一个临时表(weixintemp),表中只设计三个数据项:randid、openid、logindate。接下来就是IndexAction.class.php中接收单文本消息后,产生一个随机字符串;插入发送单文本的人的OpenID、随机字符串,并在传值时把随机字符串传给登录程序(loginwx.php)的程序。产生随机数的方法是,用当时时间通过md5加密,得到一串随机字符串。

(https://www.daowen.com)
下面是登录程序(loginwx.php)的核心部分:

程序最开始的:

判断$_SESSION['crossid']是否存在,如果存在,说明这个用户刚才就登录过,可以让用户直接访问用户的主页。
如果session不存在,则接收上页传值过来的randid,通过randid到weixintemp表中查这个用户的OpenID。如果weixintemp表中有这个randid,则为session赋值,同时要删掉这条randid的记录。然后再到weixinlogin表中查到用户的真名、用户名等信息,跳转到用户主页。