风险
用户帐号被盗用、用户权限被提升。
原则
严格控制用户认证过程和认证信息,用户身份不被假冒。
控制点
2 .1是否所有受保护的文件、目录、功能模块都要求身份验证及权限验证。
2.2 用户登录窗体安全性设计要求。
2.2 .1关闭浏览器自动填充功能。
2.2 .2防止用户口令被侦听,登录口令采用加密方式向服务器传送,如:采用口令和随机ID计算MD5后向服务器传送的方式。
2.2 .3获取用户登录或操作IP采用Request.UserHostAddress,而不能采用Request[“IP”]。
2.2 .4用户IP信息应同时包含用户代理IP的情况。
(表2 - 1 )登录窗体及登录过程
A、服务器产生Key
if (Session[ " PassKey " ] == null || Session[ " PassKey " ].ToString() == "" )
... {
Session["PassKey"]=System.Guid.NewGuid().ToString();
}
B、 用户端计算
< form name = " form1 " method = " post " action = " /login/login.aspx " onSubmit = " javascript: Login_Password.value
= hex_md5(hex_md5(Login_Password) + PassKey.value); " >
< input type = ”TextBox” name = ”Login_User_ID” autocomplete = " off " />
< input type = ”Password” name = ”Login_Password” autocomplete = " off " />
< input type = ”hidden” name = ” PassKey” value = ” e59c08a8 - 6de4 - 4a2b - bb2f - 356c31f67a0a” />
C、 服务器端登录
if (Session[ " PassKey " ] == null || Session[ " PassKey " ].ToString() == System.String.Empty)
... {
//转用户的会活没有开始.
}
string cUserID = MyHome.Security.XSS.RemoveXSS( " UserID " );
if (cUserID == System.String.Empty)
... {
//转用户没有输入用户ID
}
string cPassword = MyHome.Security.XSS.UserInputString( " Password " );
if (cPassword == System.String.Empty)
... {
//转用户没有输入用户Password
}
UserData oUserData = new UserData();
if ( ! SearchUserByID(cUserID,oUserData))
... {
//转没有找到该用户
}
if (MyHome.Security.Md5(MyHome.Security.Md5(cPassword,PASSWORDMD5KEY),Session[ " PassKey " ].ToString()) == MyHome.Security.Md5(oUserData.Password,Session[ " PassKey " ].ToString()))
... {
//其他与登录相关的业务规则2
//成功,转成功操作
}
else
... {
//失败,转失败操作
}
2.2 .6根据应用程序安全需求实施暴力攻击防范及强密码方案。
2.2 . 6 .1建议不采用锁定帐号或锁定IP的方案进行防暴力攻击方案。
2.2 . 6 .2可以采取连继登录失败5次后,用户必须输入验证码的方式来解决。
2.2 .7使用表单验证时,必须保证服务器上每个asp.net应用程序都具有一个独特的密钥。
Machine.Config
< machineKey validationKey = " AutoGenerate,IsolateApps "
decryptionKey = " AutoGenerate,IsolateApps " validation = " SHA1 " />
2.3 .登录会话保护
2.3 .1用户退出系统或关闭浏览器时,系统清除对应会话。
2.3 .2安全性级别高的Web程序必须做会话劫持防范,在会话中检验用户浏览器的Agent头信息及客户端IP地址。
2.3 .3采用多种方式保护会话Cookie不被盗用,如:对Cookie增加HttpOnly支持,运行在SSL通道上的Web项目,明确Cookie只能在SSL上传递。
2.3 .4重要操作前,采用二次密码进行用户确认.如:用户修改已确认订单的收货地址。
表( 2 - 3 - 1 )
保存客户变量,以确定绑定到相同的客户:
private void BindingToClient()
... {
string[] userIpArray=Request.UserHostAddress.Split('.');
string firtTwoOctets=userIpArray[0]+"."+userIpArray[1];
if(Session["firtTwoOctets"]==null&&Session["UserAgent"]==null)
...{
Session["firtTwoOctets"]=firtTwoOctets;
Session["UserAgent"]=Request.UserAgent;
}
else
...{
if((string)Session["UserAgent"]!=Request.UserAgent||(string)Session["firtTwoOctets"]!=firtTwoOctets)
...{
Session.Abandon();
//转登录网页
}
}
}
用户帐号被盗用、用户权限被提升。
原则
严格控制用户认证过程和认证信息,用户身份不被假冒。
控制点
2 .1是否所有受保护的文件、目录、功能模块都要求身份验证及权限验证。
2.2 用户登录窗体安全性设计要求。
2.2 .1关闭浏览器自动填充功能。
2.2 .2防止用户口令被侦听,登录口令采用加密方式向服务器传送,如:采用口令和随机ID计算MD5后向服务器传送的方式。
2.2 .3获取用户登录或操作IP采用Request.UserHostAddress,而不能采用Request[“IP”]。
2.2 .4用户IP信息应同时包含用户代理IP的情况。
(表2 - 1 )登录窗体及登录过程
A、服务器产生Key
if (Session[ " PassKey " ] == null || Session[ " PassKey " ].ToString() == "" )
... {
Session["PassKey"]=System.Guid.NewGuid().ToString();
}
B、 用户端计算
< form name = " form1 " method = " post " action = " /login/login.aspx " onSubmit = " javascript: Login_Password.value
= hex_md5(hex_md5(Login_Password) + PassKey.value); " >
< input type = ”TextBox” name = ”Login_User_ID” autocomplete = " off " />
< input type = ”Password” name = ”Login_Password” autocomplete = " off " />
< input type = ”hidden” name = ” PassKey” value = ” e59c08a8 - 6de4 - 4a2b - bb2f - 356c31f67a0a” />
C、 服务器端登录
if (Session[ " PassKey " ] == null || Session[ " PassKey " ].ToString() == System.String.Empty)
... {
//转用户的会活没有开始.
}
string cUserID = MyHome.Security.XSS.RemoveXSS( " UserID " );
if (cUserID == System.String.Empty)
... {
//转用户没有输入用户ID
}
string cPassword = MyHome.Security.XSS.UserInputString( " Password " );
if (cPassword == System.String.Empty)
... {
//转用户没有输入用户Password
}
UserData oUserData = new UserData();
if ( ! SearchUserByID(cUserID,oUserData))
... {
//转没有找到该用户
}
if (MyHome.Security.Md5(MyHome.Security.Md5(cPassword,PASSWORDMD5KEY),Session[ " PassKey " ].ToString()) == MyHome.Security.Md5(oUserData.Password,Session[ " PassKey " ].ToString()))
... {
//其他与登录相关的业务规则2
//成功,转成功操作
}
else
... {
//失败,转失败操作
}
2.2 .6根据应用程序安全需求实施暴力攻击防范及强密码方案。
2.2 . 6 .1建议不采用锁定帐号或锁定IP的方案进行防暴力攻击方案。
2.2 . 6 .2可以采取连继登录失败5次后,用户必须输入验证码的方式来解决。
2.2 .7使用表单验证时,必须保证服务器上每个asp.net应用程序都具有一个独特的密钥。
Machine.Config
< machineKey validationKey = " AutoGenerate,IsolateApps "
decryptionKey = " AutoGenerate,IsolateApps " validation = " SHA1 " />
2.3 .登录会话保护
2.3 .1用户退出系统或关闭浏览器时,系统清除对应会话。
2.3 .2安全性级别高的Web程序必须做会话劫持防范,在会话中检验用户浏览器的Agent头信息及客户端IP地址。
2.3 .3采用多种方式保护会话Cookie不被盗用,如:对Cookie增加HttpOnly支持,运行在SSL通道上的Web项目,明确Cookie只能在SSL上传递。
2.3 .4重要操作前,采用二次密码进行用户确认.如:用户修改已确认订单的收货地址。
表( 2 - 3 - 1 )
保存客户变量,以确定绑定到相同的客户:
private void BindingToClient()
... {
string[] userIpArray=Request.UserHostAddress.Split('.');
string firtTwoOctets=userIpArray[0]+"."+userIpArray[1];
if(Session["firtTwoOctets"]==null&&Session["UserAgent"]==null)
...{
Session["firtTwoOctets"]=firtTwoOctets;
Session["UserAgent"]=Request.UserAgent;
}
else
...{
if((string)Session["UserAgent"]!=Request.UserAgent||(string)Session["firtTwoOctets"]!=firtTwoOctets)
...{
Session.Abandon();
//转登录网页
}
}
}