C#布尔值条件判断异常:为何始终触发恶意脚本攻击提示
问题分析与解决方案:恶意字符检测逻辑错误导致业务分支无法进入
我帮你排查下问题,核心原因是你的HackerTextExistOrNot函数逻辑完全搞反了,导致SaveRecord里的判断条件完全不符合预期,所以才会一直进入恶意攻击的分支。
问题1:检测函数的返回语义完全颠倒
你的函数设计是想检测输入是否包含恶意字符,但当前逻辑完全搞反了:
- 当首字符是攻击字符时,返回
false(错误地标记为无恶意) - 当首字符正常时,返回
true(错误地标记为有恶意)
而SaveRecord里用的是||判断——只要有一个字段返回true就触发攻击分支,所以正常字段都会被误判成恶意输入,自然永远进不了业务逻辑。
问题2:未处理空字符串/Null的情况
如果某个字段是空字符串或null,访问text[0]会直接抛出IndexOutOfRangeException,虽然你的try-catch会抛出异常,但这会导致程序崩溃,而非正常处理。
修正后的检测函数
我把函数逻辑修正并简化,同时增加空值处理:
public bool HackerTextExistOrNot(string text) { // 先处理空值或空字符串,避免索引越界异常 if (string.IsNullOrEmpty(text)) { // 可根据业务调整:空字符串若允许则返回false,若视为恶意则返回true return false; } var attackChars = new char[] { '=', '+', '-', '@' }; // 直接返回判断结果:首字符是攻击字符则返回true(存在恶意),否则返回false return attackChars.Contains(text[0]); }
额外优化:简化SaveRecord里的重复判断
你当前在SaveRecord里写了大量重复的||判断,不仅冗余还容易出错,可以改成集合+LINQ的方式简化:
// 把所有需要检测的字段放到集合中 var fieldsToValidate = new List<string> { RRSOCSaving.STORE_CODE, RRSOCSaving.STATE, RRSOCSaving.CITY, RRSOCSaving.SITE_STORE_FORMAT, RRSOCSaving.STORE_SITENAME, // ... 补充其他所有需要检测的字段 RRSOCSaving.ALPM_ECNUMBER }; // 检查是否存在任意一个恶意字段 bool hasMaliciousInput = fieldsToValidate.Any(field => objGetData.HackerTextExistOrNot(field)); if (hasMaliciousInput) { strReturnId = "Something went wrong due to malicious script attack..!!!"; } else { // 原来的正常业务逻辑分支 if (RRSOCSaving.ROLE_ASSIGNED == "SLP State Head") { // ... 你的业务代码 } else if (RRSOCSaving.ROLE_ASSIGNED == "NHQ Admin") { // ... 你的业务代码 } }
这样修正后,检测逻辑就能正常工作:正常输入会进入业务分支,只有当字段首字符是指定攻击字符时,才会触发恶意攻击提示。
内容的提问来源于stack exchange,提问作者HEEN
相关产品推荐
相关产品推荐

