CodeQL 文档

值遮蔽

ID: cs/web/ambiguous-client-variable
Kind: problem
Security severity: 
Severity: warning
Precision: medium
Tags:
   - security
   - maintainability
   - frameworks/asp.net
   - external/cwe/cwe-348
Query suites:
   - csharp-security-extended.qls
   - csharp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

依靠 HttpRequest 来提供对特定客户端变量的访问是不安全的。HttpRequest 类实现了一个索引器,以便按特定顺序(QueryStringFormCookiesServerVariables 集合)提供对其的简化组合访问。搜索变量时,将返回第一个匹配项:因此,QueryString 参数会取代表单、Cookie 和服务器变量中的值,依此类推。这是一个严重的安全漏洞,因为攻击者可以在查询字符串中注入您不希望看到的值,从而取代更可信集合的值。

建议

将搜索范围明确限制为 QueryStringFormCookies 集合之一。

示例

在此示例中,尝试通过比较服务器设置的 Cookie 和用户发送的表单变量来防止跨站请求伪造攻击。问题在于,如果用户没有发送名为 csrf 的表单变量,则集合将回退使用 Cookie 值,从而使伪造的请求看起来像是由用户发起的。

class ValueShadowing
{
    public bool checkCSRF(HttpRequest request)
    {
        string postCSRF = request["csrf"];
        string cookieCSRF = request.Cookies["csrf"];
        return postCSRF.Equals(cookieCSRF);
    }
}

通过明确指定我们要查找表单变量,可以轻松解决此问题。

class ValueShadowingFix
{
    public bool checkCSRF(HttpRequest request)
    {
        string postCSRF = request.Form["csrf"];
        string cookieCSRF = request.Cookies["csrf"];
        return postCSRF.Equals(cookieCSRF);
    }
}

参考

  • ©GitHub 公司
  • 条款
  • 隐私