防止在C#Web窗体应用程序上使用“打开重定向”漏洞

时间:2017-03-28 13:54:44

标签: 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") == 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的方法如下:

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仍然认为这些修复不足以确保HARDCODED重定向得到充分验证。

This is the full message on veracode.

This is the page他们带我去展示这次袭击是如何运作的例子。

我想假设这是误报,但它仍然影响我的分数。

0 个答案:

没有答案