多级用户登录教程先提供部分。。。。。数字面包网站现已重新开通!
地址:http://211.99.210.100/01470/default.asp
最近会加入面包最新写的多级用户登录教程,自认为这个教程是面包写得最为规范的一个了,当然希望各位多提意见可以让面包做的更好!
以前说起的macromedia公司的插件实在是因为没有时间录入,现在完成了300个左右的插件,或者过几天也会先提供的!
数字面包的网站开张有半年左右了,面包其实是一点不懂什么网络程序的,就靠UltraDev会做些小东西。也是因为工作的一些因素所以面包对UltraDev相对熟悉一些,一直以来面包努力把自己所知道的、所会的尽可能的公布给网友,也算为UltraDev在国内应用尽一份自己微薄的力量吧。
改版的想法由来已久,只是一直没有行动。原因很简单,没有好的、完整的思路。包括上次说的联盟也是如此。这次面包很想有个完整的策划做好这次网站的改版。
有次见到大富翁论坛和udzone.com有些启发。所以这次面包想将网站做成开放式的,并且是需注册用户的。就是说只要是用户都有义务为UltraDev的推广出力,你要获得别人的资料必须有自己的付出。再将论坛和网站合在一起,包括源码、资料、教程等等。获得和支出以分数形式显示,当然,初级用户也不用担心,可以做些基础的工作来得到分数。因为这个系统应该很复杂,所以面包想请众位UltraDev网友出点建议,包括各个栏目设置的具体形式,需要多少字段等等。
栏目:
更新动态
业界新闻
UD教程
UD插件
UD源码
UD系统
UD资料
相关资源
留言簿
友情系统
调查系统
收藏系统
UD论坛
总之花样太多,其中细节一时说不了,欢迎大家讨论^_^
个人认为udzone的形式不错,应该可以借签,并且这次改版将用UltraDev制作,不到万不得已不改动源码,这不光是对面包的一次考验也是对UltraDev功能的一次检验。
---------------------------------------
使用UltraDev4.0制作的登录系统有个登录漏洞,其实这个不是UltraDev的原因,该漏洞很早就已经在网上流传了,最近网友spm提醒说是UltraDev4制作的也同样存在这个问题。经过测试,果然可以用字符串轻易通过用户验证。让我们先对漏洞本身有个了解再作打算……
…………
很多Asp程序把密码放到数据库中,在登陆验证中用以下sql:
sql="select * from user where username='"&username&"'and pass='"& pass&'"
此时,您只要根据sql构造一个特殊的用户名和密码,如:ben' or '1'='1
这样,程序将会变成这样: sql="select*from user where username="&ben'or'1'=1&"and pass="&pass&"
学过编程的应该知道: or 是一个逻辑运算符,作用是在判断两个条件的时候,只要其中一个条件成立,那么等式将会成立.而在语言中,是以1来代表真的(成立).那么在这行语句中,原语句的"and"验证将不再继续,而因为"1=1"和"or"令语句返回为真值.
…………(以上摘录于网络)
现在我们知道了,利用“' or '”作为用户名和密码可以登陆UltraDev4生成的登陆系统,那可是个大问题。没有站长喜欢别人随便登陆自己网站的管理页的,我们再来看看UltraDev4生成的登陆代码
…………
MM_LoginAction = Request.ServerVariables("URL")
If Request.QueryString<>"" Then MM_LoginAction = MM_LoginAction + "?" + Request.QueryString
MM_valUsername=CStr(Request.Form("Aadmin"))
'从表单内Aadmin域中取得用户名的变量MM_valUsername
If MM_valUsername <> "" Then
MM_fldUserAuthorization=""
MM_redirectLoginSuccess="admin.asp"
MM_redirectLoginFailed="error.htm"
MM_flag="ADODB.Recordset"
set MM_rsUser = Server.CreateObject(MM_flag)
MM_rsUser.ActiveConnection = MM_connBHP_STRING
MM_rsUser.Source = "SELECT fAdmin, fPassword"
If MM_fldUserAuthorization <> "" Then MM_rsUser.Source = MM_rsUser.Source & "," & MM_fldUserAuthorization
MM_rsUser.Source = MM_rsUser.Source & " FROM tAdmin WHERE fAdmin='" & MM_valUsername &"' AND fPassword='" & CStr(Request.Form("Apassword")) & "'"
'SQL语句中密码值是通过表单中的Apassword来获取
…………
在注释部分我们找到了登录动作的要点:用户名是在表单中Aadmin域直接获得存放入变量MM_valUsername,而密码则是直接从Apassword域中获得值。从VBScript的基础可以知道Replace是一个返回字符串函数,可以指定某子字符串被替换为另一个子字符串。那么在以上代码中我们将用户输入的“'”进行替换为其它字符就可以轻易达到封闭该漏洞的效果。
MM_luser=CStr(Request.Form("Aadmin"))
'建立变量MM_luser获得表单内Aadmin域的值
MM_valUsername=Replace(MM_luser,"'","")
'如果变量MM_luser中存在“'”字符则利用Replace将之替换为空,然后把值放入用户名变量MM_valUsername
MM_lpassword=CStr(Request.Form("Apassword"))
'建立变量MM_lpassword获得表单内Apassword域的值
MM_valUserpassword=Replace(MM_lpassword,"'","")
'如果变量MM_valUserpassword中存在“'”字符则利用Replace将之替换为空,然后把值放入密码变量MM_lpassword
完成对“'”字符的替换后将变量写入代码如下:
…………
MM_LoginAction = Request.ServerVariables("URL")
If Request.QueryString<>"" Then MM_LoginAction = MM_LoginAction + "?" + Request.QueryString
MM_luser=CStr(Request.Form("Aadmin"))
MM_valUsername=Replace(MM_luser,"'","")
MM_lpassword=CStr(Request.Form("Apassword"))
MM_valUserpassword=Replace(MM_lpassword,"'","")
If MM_valUsername <> "" Then
MM_fldUserAuthorization=""
MM_redirectLoginSuccess="admin.asp"
MM_redirectLoginFailed="error.htm"
MM_flag="ADODB.Recordset"
set MM_rsUser = Server.CreateObject(MM_flag)
MM_rsUser.ActiveConnection = MM_connBHP_STRING
MM_rsUser.Source = "SELECT fAdmin, fPassword"
If MM_fldUserAuthorization <> "" Then MM_rsUser.Source = MM_rsUser.Source & "," & MM_fldUserAuthorization
MM_rsUser.Source = MM_rsUser.Source & " FROM tAdmin WHERE fAdmin='" & MM_valUsername &"' AND fPassword='" & MM_valUserpassword & "'"
…………
这样就可以避免不怀好意的用户利用该漏洞来登录了。
其次我们还要考虑到用户注册时在用户名或密码中使用了“'”,那么岂不是无法登录了。那么我们在应该在注册页面上禁用该字符进行注册,一般可以利用JS来验证表单中文本域的内容来做到:
其中form1是登录表单名;l_user是用户文本框;l_password是密码文本框。
好了,经过这样的更改,这个登录系统对于“' or '”应该是没有顾虑了,即使有其它字符也可以用类似的方法来解决。你可以前往我的网站去测试这个登录系统。
地址:http://ultradev.my001.net