本类共有 867 篇文章,今日更新 0

另类安全验证登陆的方法

[ 来源:http://www.91now.com/down/ | 作者: | 时间:2007-5-18 17:35:15 | 浏览: 人次 ]


目前网上的论坛以及各种门户网站都会有一个用户登陆的界面,对登陆入口处用户名和密码的输入验证无疑就是网站安全的第一道防线,而关于用户输入有句名言永远是正确的:“凡是用户的输入都是非法的。”从安全的角度来说,只要有用户输入的地方就一定有安全漏洞,只是何时被何人发现而已,尤其对于现在被大量使用的各种集成建站工具软件来说,由于其源代码是公开的,任何人只要有时间、有决心认真去读代码,输入漏洞的被发现只是迟早的事情。对于登陆的输入验证,自从最早的’ or ‘’=’被发现开始,代码编写者对输入的用户名及密码的字符串过滤就越来越严格,以至于现在的很多系统对合法的用户名和密码字符串有严格的限定。笔者从密码的MD5加密储存过程想到一种用户名合法性的另类验证法,目的是完全绕过用户名输入中可能的非法字符,从而跳出越来越严格的合法字符集和正则表达式VS不断有新发现的非法字符的恶性循环。 
其原理简单来说就是借鉴密码的验证方法,增加一个用户名经MD5加密的数据项(user_name_md5),验证时比较的是加密后的用户输入的用户名,从而降低用户输入过滤不周全的风险。 
如原来的验证方法一般描述为: 
user_id=Request.Form(“USER_ID”) //取输入的用户名 
user_id=Check(user_id) //验证用户名是否含有非法字符 
passwd=Request.Form(“PASSWD”) //取输入的密码 
passwd_md5=Encode_MD5(passwd) //对输入的密码进行MD5加密变换 
sql=”SELECT passwd from userlib where username=’”&user_id&”’” //SQL语句 
rs.open sql,conn,1,1 //执行SQL命令,最大的风险点 
if passwd_md5=rs(“passwd”) then to_do_login //验证密码 
else Response(“error”) 
其中如果user_id中的字符过滤不严格就会导致SQL语句的执行出错,从而提供给输入人一个试探系统和执行其它SQL命令的机会。如果采用本方法,对输入的USER_ID不进行过滤而是直接进行MD5加密,即Check(user_id)改为Encode_MD5(user_id),然后SQL语句改为 
SELECT passwd from userlib where user_name_md5=user_id 
由于加密后的user_id内容为二进制字符串,从而保证整个SQL语句不会有执行的错误可能,使得整个验证过程完全绕过了输入内容中的可能风险信息,提高验证的安全性。 
更进一步来分析,如果比较的对象是由用户名加密码组合后变换的MD5字符串,则安全性更有保障。如: 
check_string=user_id+passwd 
check_md5=Encode_MD5(check_string) 
SQL=”SELECT all from userlib where user_check_md5=’”&check_md5&”’” 
本方法增加的开销为每个用户名一个数据段的数据空间,以及验证用户登陆时作多一次MD5计算(第二种方法则只要做一次),但避免了对用户输入过滤的不完全性可能,应当说是牺牲了少许资源来换取跟安全的系统。如果再配合对登陆尝试的IP限定和登陆频率的限定,从登陆的安全角度来说应当是比较全面的了。 
本文行文仓促,考虑不周之处,还请行家提点。

广告位