ASP缺陷----一个特殊字符chr(0)

这个问题最初是由登陆安全引出的.

几个月前,设计了一个登陆cookie加密的方案,并将它应用到自己的一个系统中.

方案大致如下:

登录时选择记住密码->

由指定字符随机生成一个32位长度的加密码,并使用该加密码将md5编码过的用户名和密码存储至cookie.

同时存储用户id编号,并将这个加密码存储在用户表的对应字段中.

用户在下次访问该页面试图登录时,会先判断是否存在cookie,存在,就先从cookie信息中读取用户名,密码及用户id的信息,并将用户名和密码解密回md5码,与数据库中用户名,密码的md5值比较,

从而认证信息,认证失败就清除信息,要求用户登录,认证成功就直接使用该信息登录.

 

但使用时发现一个很奇怪的问题,就是有时候自动登录可以成功,有时候却出现脚本错误,错误就在解密的字符串那里,查看cookie发现,写入的加密串短了.于是几经调试,终于发现,问题在于加密函数中使用了xor,当随机码与md5码对应位置的字母相同时,得到的结果就是0,返回的字符串中就有了chr(0),而正是这个字符,造成cookie输出不完全.于是,只得在生成随机码时确定位置不能和用户名,密码对应位置的字母相同,这样,问题就解决了.

问题是解决了,依旧不太明白asp这个机制,后来测试发现,response.write,request.querystring等方法同样的此缺陷.

一个测试页面,demo.asp

Response.write "asd"&chr(0)&"dsa"
Response.write "<br>"
Response.write Len(Request.queryString)&"<br>"
Response.write Len(Request.queryString("a"))&"<br>"
当请求字串是:demo.asp?a=asd%00dsa 时,输出结果

 

asd
7
3

这说明原始字符串是有的,解析成对应值的时候,从chr(0)断开了

response.write中包含该字符时同样会断开

发现该问题后同样的方法测试了php环境,没有这种断字符串的现像.

唉,无奈..