设置防止攻击session(疑惑)
在登录的时候会对ip进行过滤,公司是这样做的,有点困惑,先记录下来。
#region 防攻击操作限制。
if (SetCCStatus() || NDUserDefenderLogin.Intercept())
{
msg.OpCode = 9;
msg.Description = "登录限制";
break;
}
#endregion
其中SetCCStatus()就是ip过滤的,先看下其定义吧:
#region 设置防攻击的 Session。[SetCCStatus()]
/// <summary>
/// 设置防攻击的 Session。
/// </summary>
/// <returns>如果超过了最大限制次数,则返回<c>true</c>;否则,返回<c>false</c>。</returns>
protected Boolean SetCCStatus()
{
Boolean status = false;
if (null == HttpContext.Current.Session || null == HttpContext.Current.Session["CountForCC"])//为什么是CountForCC
{ // 如果没有 Session,则创建。
HttpContext.Current.Session["CountForCC"] = 0;
}
Int32 count = (Int32)HttpContext.Current.Session["CountForCC"];//奇怪 session 的限制数怎么会直接到session中取呢?
HttpContext.Current.Session["CountForCC"] = count + 1;
Int32 maxCount = Int32.Parse(SystemConfig.Get("AqReg_Login_MaxCCCount"));//最大的限制数 它是怎么知道“AqReg_Login_MaxCCCount”
if (count > maxCount)
{
status = true;
LogAssist.GetLogger("CC\\Max").Warn(SysVariable.GetIPAddress());
}
return status;
}
#endregion
那么我们来看下 Int32 maxCount = Int32.Parse(SystemConfig.Get("AqReg_Login_MaxCCCount"));//最大的限制数 它是怎么知道“AqReg_Login_MaxCCCount”
先看这个SystemConfig.Get("AqReg_Login_MaxCCCount")函数再说:
/// <summary>
/// 获取配置信息。
/// </summary>
/// <param name="key">配置键。</param>
/// <returns>配置值。</returns>
public static String Get(String key)
{
if (store.Count == 0 || lastLoadTime.AddMinutes(5) < DateTime.Now)
{
String message = 0 == store.Count ? "基础配置为空,去数据库载。" : "到点自动重新加载配置。";
LogAssist.GetLogger("SystemConfig\\Debug").Debug(message);
Loading();
}
var config = store.Where(p => p.SysKey.ToLower().Trim() == key.ToLower().Trim()).FirstOrDefault();
if (config == null)
{
throw new Exception(string.Format("SystemConfig.{0} Not Exists!", key));
}
else
{
return config.SysValue;
}
}
那么Get得到的参数是 AqReg_Login_MaxCCCount,这是个怎么样的参数,可以获得配置的值?先看下这个函数的实现:
/// <summary>
/// 获取配置信息。
/// </summary>
/// <param name="key">配置键。</param>
/// <returns>配置值。</returns>
public static String Get(String key)
{
if (store.Count == 0 || lastLoadTime.AddMinutes(5) < DateTime.Now)
{
String message = 0 == store.Count ? "基础配置为空,去数据库载。" : "到点自动重新加载配置。";
LogAssist.GetLogger("SystemConfig\\Debug").Debug(message);
Loading();
}
var config = store.Where(p => p.SysKey.ToLower().Trim() == key.ToLower().Trim()).FirstOrDefault();
if (config == null)
{
throw new Exception(string.Format("SystemConfig.{0} Not Exists!", key));
}
else
{
return config.SysValue;
}
}
看下这个函数可以知道 传进来的key其实是对store(配置信息进行查询),看下store 的定义吧:
/// <summary>
/// 配置信息集合。
/// </summary>
static List<SystemConfigInfo> store;
不用说SystemConfigInfo就是个实体类了,看下这个实体类定义了什么:
/// <summary>
/// 系统配置信息。
/// </summary>
class SystemConfigInfo
{
#region 存储字段。
String _syskey;
String _sysvalue;
#endregion
#region 获取键名称。
/// <summary>
/// 获取键名称。
/// </summary>
/// <value>键名称。</value>
public String SysKey
{
get { return _syskey; }
}
#endregion
#region 获取值。
/// <summary>
/// 获取值。
/// </summary>
/// <value>值。</value>
public String SysValue
{
get { return _sysvalue; }
}
#endregion
#region 创建实例。[Instance(IDataReader idr)]
/// <summary>
/// 创建实例。
/// </summary>
/// <param name="idr">数据流对象。</param>
/// <returns>系统配置信息。</returns>
internal static SystemConfigInfo Instance(IDataReader idr)
{
SystemConfigInfo obj = new SystemConfigInfo();
obj._syskey = idr["config_key_name"].ToString();
if (FormatAssist.Convert2Boolean(idr["config_iscrypto"], false) && !String.IsNullOrEmpty(idr["config_value"].ToString().Trim()))
{ // 需要解密。
try
{
obj._sysvalue = PDesc.Decrypt(idr["config_value"].ToString(), PDesc.Key);
}
catch (Exception ex)
{
LogAssist.GetLogger("SystemConfig\\BaseConfig").Fatal("Loading:" + obj._syskey, ex);
obj._sysvalue = String.Empty;
}
}
else
{
obj._sysvalue = idr["config_value"].ToString();
}
return obj;
}
#endregion
}
获得的配置信息要加载Loading()函数,这个函数其实就是实现配置信息的实例化的。
这个Loading()函数要到数据库中查询配置信息:
/// <summary>
/// 加载配置信息。
/// </summary>
static void Loading()
{
lastLoadTime = DateTime.Now;
try
{
List<SystemConfigInfo> tmp = new List<SystemConfigInfo>();
using (IDataReader idr = SubSqlHelper.ExecuteReader(BaseConfig, CommandType.Text, "SELECT * FROM [dbo].[userdbconfig_varchar] WITH(NOLOCK);"))
{
while (idr.Read())
{
tmp.Add(SystemConfigInfo.Instance(idr));
}
}
store = tmp; // 加载成功附加到正在使用的缓存中。
LogAssist.GetLogger("SystemConfig\\Debug").Debug("基础配置加载成功。");
}
catch (Exception ex)
{
LogAssist.GetLogger("SystemConfig\\BaseConfig").Fatal("Loading", ex);
}
}

浙公网安备 33010602011771号