设置防止攻击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);
           }
       }

 

 

 

 

 

 

 

posted @   小霖2012  阅读(495)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示