我正在创建一个使用Roslyn作为项目一部分的分析器,并且想知道是否有可能找出如何定义/分配在函数调用中作为参数传递的变量。
例如,我有以下代码:
string url = Request.QueryString["url"];
Response.Redirect(url);
我有找到LocalDeclarationStatement的代码并评估变量初始值设定项以查看它是否包含“Request.QueryString”;从而验证变量url是由用户输入分配的。然后遍历每个InvocationExpressionSyntax,查找ArgumentList中包含IdentifierName“url”的Response.Redirect。如果用户提交的URL包含在Response.Redirect调用中,则分析器应创建规则。
foreach (VariableDeclaratorSyntax dec in varDec)
{
if (dec.Initializer != null)
{
if (dec.Initializer.ToString().Contains("Request.QueryString"))
{
foreach (InvocationExpressionSyntax invocation in invocExpression)
{
if (invocation.Expression.ToString().Contains("Response.Redirect") && invocation.ArgumentList.Arguments.ToString().Contains(dec.Identifier.ToString()))
{
context.ReportDiagnostic(Diagnostic.Create(Rule, invocation.ArgumentList.GetLocation()));
}
}
}
}
我很快意识到这不是解决问题的正确方法,因为如果我要使用以下代码:
string url = "Not user input";
Response.Redirect(url);
url = Request.QueryString["url"];
Response.Redirect(url);
然后,我的分析器不仅会标记Response.Redirect的预期调用(最后一个),而且还会标记第一个实际上不包含由用户输入定义/分配的变量的调用。
我想要做的是查找Response.Redirect(url)的调用,并分析参数'url'以确定它是否由用户输入定义/分配。截至目前,在某种意义上,我无法想到从变量到找到它的定义或赋值的任何方式。我发现this stackoverflow问题与查找有关参数的信息有关,但他们只想检索名称。
如果有人对罗斯林是否可以这样做有任何见解并且可以指出正确的方向,我将非常感激。 谢谢!