设置防止攻击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);
            }
        }
原文地址:https://www.cnblogs.com/huaizuo/p/2408281.html