设置防止攻击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); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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代理技术深度解析与实战指南