代码如下所示 - 这是明显有问题的代码:
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 page他们带我去展示这次袭击是如何运作的例子。
我想假设这是误报,但它仍然影响我的分数。