防止';打开重定向';利用C#Web表单应用程序

防止';打开重定向';利用C#Web表单应用程序,c#,redirect,c#-4.0,C#,Redirect,C# 4.0,代码如下所示-这是明显的违规代码: readonly Regex alphaNumericRegex = new Regex("^[a-zA-Z0-9_]*$"); private const string USERNAME = "bitzleon"; protected void Page_PreInit(object sender, EventArgs e) { if (HttpContext.Current.Request.QueryString.Get("userid") ==

代码如下所示-这是明显的违规代码:

readonly Regex alphaNumericRegex = new Regex("^[a-zA-Z0-9_]*$");
private const string USERNAME = "bitzleon";
protected void Page_PreInit(object sender, EventArgs e)
{
    if (HttpContext.Current.Request.QueryString.Get("userid") == null)
    {
        UriBuilder uriBuilder = new UriBuilder(Request.Url);
        NameValueCollection query = HttpUtility.ParseQueryString(uriBuilder.Query);
        query["userid"] = USERNAME;
        uriBuilder.Query = query.ToString();
        if (alphaNumericRegex.IsMatch(query["userid"]) && IsLocalUrl(uriBuilder.ToString()))
        {
            Response.Redirect(uriBuilder.ToString());
        }
    }
}
Response.Redirect(uriBuilder.ToString())
在我的Veracode扫描中抛出错误-但是我正在运行两个检查,以确保重定向是有效的和内部的

首先,查询需要是字母数字的-正则表达式负责这一点-其次,我们重定向到的url只是本地的。我使用的验证url的方法如下所示:

public bool IsLocalUrl(string url)
{
    if (string.IsNullOrEmpty(url))
    {
        return false;
    }
    Uri absoluteUri;
    if (Uri.TryCreate(url, UriKind.Absolute, out absoluteUri))
    {
        return String.Equals(Request.Url.Host, absoluteUri.Host,
                    StringComparison.OrdinalIgnoreCase);
    }
    bool isLocal = !url.StartsWith("http:", StringComparison.OrdinalIgnoreCase)
                    && !url.StartsWith("https:", StringComparison.OrdinalIgnoreCase)
                    && Uri.IsWellFormedUriString(url, UriKind.Relative);
    return isLocal;
}
但是Veracode仍然认为这些修复不足以确保硬编码重定向得到充分验证

当演示此攻击如何工作的示例时,它们会将我带到


我想假设这是一个假阳性,但它仍然影响着我的分数

你看到了什么错误?我在主帖中添加了veracode截图。也许可以将url转换为相对url(Request.url.PathAndQuery),并使用内置的IsUrlLocalToHost()-它永远不会分析你的代码,直到它会说“啊,但是有一个有效的检查来强制本地url”因此,也许使用框架方法可以满足这一要求。Veracode现在有了一个社区,他们可以回答以下问题: