游客发表
写ASP登录页,户登最烦的户登不是代码本身,是户登Session和Cookie到底该信谁。我见过一个后台系统,户登登录成功后把用户ID往Session一塞,户登页面跳转,户登看起来没问题。户登结果运维重启了IIS,户登所有人被踢回登录页,户登客户打电话骂了半小时。户登那会儿我就明白,户登ASP的户登登录逻辑得从状态管理说起。
先看最朴素的户登写法。一个login.asp页面,户登两个输入框,户登一个提交按钮。表单method="post",action指向check.asp。check.asp里用Request.Form("username")拿到账号,连数据库查密码。密码匹配就Session("user") = rs("id"),然后Response.Redirect("main.asp")。不匹配就Response.Write("账号或密码错误")。这段代码十分钟能写完,但它有个坑:Session默认20分钟过期,用户填一半表单去接个电话,回来一提交,Session没了,页面报错。你得在登录页顶部加一句<% Session.Timeout = 60 %>,把超时拉长。
密码明文存储是另一个常见问题。我接手过一个老系统,数据库里密码字段直接写着"123456"。问开发为什么,他说"反正内网用"。内网也不该这么干。ASP里可以用MD5加密,虽然现在看MD5也不安全,但至少比明文强。代码大概是这样:<% password = MD5(Request.Form("pwd")) %>,然后拿加密后的串去比对。MD5函数得自己写,网上有现成的VBScript版本,复制过来就能用。
Cookie和Session的配合也值得说。有些场景需要"记住我"功能,用户勾选后,下次打开浏览器直接进后台。做法是在登录成功时写一个Cookie,存一个加密的令牌,比如用户ID加时间戳再MD5。下次访问时先检查Session,没有就检查Cookie,Cookie有效就重建Session。这里有个细节:Cookie要设过期时间,Response.Cookies("token").Expires = DateAdd("d", 7, Now())。不设的话,浏览器一关就没了。
SQL注入是ASP登录页的老朋友。早期代码喜欢拼接字符串:"SELECT * FROM users WHERE name='" & username & "' AND pwd='" & password & "'"。攻击者在用户名框里输入"' OR '1'='1",密码随便填,直接绕过验证。修复方法是用参数化查询,但ASP原生不支持,得靠Command对象。或者至少做个简单过滤,把单引号替换掉:username = Replace(username, "'", "''")。这招不完美,但能挡住大部分脚本小子。
验证码也常被忽略。没有验证码,攻击者可以写个循环,每秒试几百个密码。ASP里生成验证码不难,用Scripting.FileSystemObject创建临时图片,或者简单点,用Session存一个随机数,输出到页面让用户填。关键是验证码要一次性使用,验证完立刻Session.Abandon或者清空那个Session变量。
最后说个实际遇到的坑。有次登录后跳转用Response.Redirect,但前面已经有Response.Write输出了空格。ASP会报"HTTP头已发送"错误。解决办法是在文件最开头加<% Response.Buffer = True %>,把所有输出缓存起来,Redirect就不会冲突。这个细节很小,但调试起来能花你一下午。
登录页写起来简单,要写得稳,得把Session超时、密码加密、Cookie续期、注入过滤、验证码、Buffer设置这几件事都照顾到。少一个,线上就可能出问题。
随机阅读
热门排行
友情链接