在 C# 中检查是否为字符串格式的条件
Check if condition in string format in c#
我不确定天气是否可能,但我必须以某种方式在我的项目中这样做。
我得到一个字符串格式的条件,如:
string condition = "(param1='69' OR param1='66' OR param1='21' OR param1='93') AND (param2='FL' OR param2='WA) AND (param3!='31' AND param3!='19')";
这个条件是我从 db 得到的,我的代码中有 param1、param2 和 param3 的值。现在我必须在 if 语句中检查这个条件是否符合真假并相应地显示结果。
我尝试用实际值替换 param1、param2、param3,比如 69、CA、22。因此字符串将如下所示:
condition = "(69='69' OR 69='66' OR 69='21' OR 69='93') AND (CA='FL' OR CA='WA) AND (22!='31' AND 22!='19')";
并尝试在 bool 中转换它,但它不起作用。
请告诉我是否有任何办法,否则我需要硬编码吗?
还有一件事,条件可能非常好,比如有时它会带有 2 个变量,有时会带有 4 个变量。
C#(和其他编译型 .NET 语言)不是 "JIT" 解释型语言,它也不进行自动类型转换(数字 != 字符串)。如果您想在 C# 中执行此操作,则必须自己分析和处理字符串。
但是...由于您已经在使用数据库,并且从它的外观来看它正在处理 SQL,您可以简单地将任务委托给数据库并获得最终结果而不是条件字符串.
调用一个存储过程,它接受你的参数和查询字符串的键,并让它成为 return 布尔结果,或者在你创建的注入字符串前加上一个 SELECT
并再次使用数据库引擎进行处理。只要确保您知道自己想要注入危险的用户输入,否则您将面临 SQL 注入攻击。
如果您确实需要在应用程序中测试条件并且可以进一步修改条件字符串,我可以建议您使用 DataTable
进行破解。 DataTable
可以 评估您的字符串:
public class Program
{
public static void Main(string[] args)
{
// modified string !
// "!=" -> "<>"; CA -> 'CA'
string condition = "('69'='69' OR '69'='66' OR '69'='21' OR '69'='93') AND ('CA'='FL' OR 'CA'='WA') AND ('22'<>'31' AND '22'<>'19')";
Console.WriteLine(TestCondition(condition));
// print FALSE because ('CA'='FL' OR 'CA'='WA') is FALSE
}
public static bool TestCondition(string c)
{
var dt = new DataTable();
dt.Columns.Add("col");
dt.Rows.Add("row");
// hack
// c is constant and doesn't depend on dt columns
// if there are any rows, c is TRUE
var rows = dt.Select(c);
return rows.Length > 0;
}
}
我不确定天气是否可能,但我必须以某种方式在我的项目中这样做。 我得到一个字符串格式的条件,如:
string condition = "(param1='69' OR param1='66' OR param1='21' OR param1='93') AND (param2='FL' OR param2='WA) AND (param3!='31' AND param3!='19')";
这个条件是我从 db 得到的,我的代码中有 param1、param2 和 param3 的值。现在我必须在 if 语句中检查这个条件是否符合真假并相应地显示结果。
我尝试用实际值替换 param1、param2、param3,比如 69、CA、22。因此字符串将如下所示:
condition = "(69='69' OR 69='66' OR 69='21' OR 69='93') AND (CA='FL' OR CA='WA) AND (22!='31' AND 22!='19')";
并尝试在 bool 中转换它,但它不起作用。
请告诉我是否有任何办法,否则我需要硬编码吗? 还有一件事,条件可能非常好,比如有时它会带有 2 个变量,有时会带有 4 个变量。
C#(和其他编译型 .NET 语言)不是 "JIT" 解释型语言,它也不进行自动类型转换(数字 != 字符串)。如果您想在 C# 中执行此操作,则必须自己分析和处理字符串。
但是...由于您已经在使用数据库,并且从它的外观来看它正在处理 SQL,您可以简单地将任务委托给数据库并获得最终结果而不是条件字符串.
调用一个存储过程,它接受你的参数和查询字符串的键,并让它成为 return 布尔结果,或者在你创建的注入字符串前加上一个 SELECT
并再次使用数据库引擎进行处理。只要确保您知道自己想要注入危险的用户输入,否则您将面临 SQL 注入攻击。
如果您确实需要在应用程序中测试条件并且可以进一步修改条件字符串,我可以建议您使用 DataTable
进行破解。 DataTable
可以 评估您的字符串:
public class Program
{
public static void Main(string[] args)
{
// modified string !
// "!=" -> "<>"; CA -> 'CA'
string condition = "('69'='69' OR '69'='66' OR '69'='21' OR '69'='93') AND ('CA'='FL' OR 'CA'='WA') AND ('22'<>'31' AND '22'<>'19')";
Console.WriteLine(TestCondition(condition));
// print FALSE because ('CA'='FL' OR 'CA'='WA') is FALSE
}
public static bool TestCondition(string c)
{
var dt = new DataTable();
dt.Columns.Add("col");
dt.Rows.Add("row");
// hack
// c is constant and doesn't depend on dt columns
// if there are any rows, c is TRUE
var rows = dt.Select(c);
return rows.Length > 0;
}
}