在论坛里保存用户登陆信息的一般可以用session和cookies。session是保存在服务器端的,应该不会被人利用;而cookies是保存在客户端的,有被篡改的可能。
在网上有很多介绍cookies欺骗的方法,而我也找到了可以修改cookies信息的软件(iecv容笑精简汉化版)。这实在是一件危险的事情。
试想一下,在一个没有采取任何措施防止cookies欺骗的论坛上,我先注册一个用户并登陆,然后用这个软件把cookies中的用户名改成管理员的用户名,那么我就可以开始在这个论坛捣乱了。
考虑了几天之后,查看了一下动网论坛和PHPWIND的文件,还是没有搞清楚这两个论坛是怎样防止cookies欺骗的。最后决定还是用我自己的办法。
总体的思路就是利用随机数防止cookies欺骗。 ASP可以用: randomize dim randnum randnum=clng(rnd*99999999) PHP可以用: $randnum=rand(1,99999999); 99999999应该足够了,不需要设的更大了,当然还可以用md5加密一下,更保险。
第一步:在数据库的用户表中添加一个randnum字段,文本,50个字符就足够了。
第二步:修改注册页面程序,在把用户资料添加到数据库的时候,把产生的随机数也写入数据库的randnum。其实这也算是用户名之外的一个标识。
第三步:修改登陆页面,在用户名和密码通过验证之后,取出对应这个用户名的randnum,并写入cookies。也就是说,产生了两个cookies,一个是用户名username,一个随机数randnum。注意这两个cookies应该同步产生,以免造成失效时间不统一。
第四步:有了randnum这个cookies,我们就可以防止cookies欺骗了。在程序中需要用户cookies的地方加上验证,或者在所有页面加上验证也可以。
具体方法是:取出数据库中用户名符合用户名cookies并且randnum符合随机数cookies的记录, ASP可以用:
select * from user where username='"&request.cookies("username")&"' and randnum='"&request.cookies("randnum")&"'
PHP可以用:
select * from user where username='$_cookie[username]' and randnum='$_cookie[randnum]' 如果结果为空的话,就清空所有的cookies。
到这里,防止cookies欺骗就全部完成了。熟悉程序和数据库的朋友应该可以看的出来,上面的思路就是用户在登陆的时候需要验证两个cookies,一个是用户名,一个是随机数,用户名可以很轻松的修改,但是随机数就很难猜到了。即使你把用户名修改成管理员的用户名,但是因为随机数不符合,也会清空cookies而无法登陆。
创意设计工作室愿大家建立更安全的网站