zoukankan      html  css  js  c++  java
  • 设置防止攻击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);
                }
            }
    
  • 相关阅读:
    关于高等代数的计算题III(线性方程组)
    关于高等代数的计算题I(矩阵,标准形,二次型)
    日志打印太多导致cpu 100%问题解决
    xxl-job串行任务挂死问题
    apache http调用设置超时时间
    动态修改logback日志级别
    prom2click批量参数设置
    logback日志使用
    跨线程池传递线程变量,使用阿里的transmittable-thread-local
    ES操作整理
  • 原文地址:https://www.cnblogs.com/huaizuo/p/2408281.html
Copyright © 2011-2022 走看看