值遮蔽¶
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
依靠 HttpRequest
来提供对特定客户端变量的访问是不安全的。HttpRequest
类实现了一个索引器,以便按特定顺序(QueryString
、Form
、Cookies
或 ServerVariables
集合)提供对其的简化组合访问。搜索变量时,将返回第一个匹配项:因此,QueryString
参数会取代表单、Cookie 和服务器变量中的值,依此类推。这是一个严重的安全漏洞,因为攻击者可以在查询字符串中注入您不希望看到的值,从而取代更可信集合的值。
建议¶
将搜索范围明确限制为 QueryString
、Form
或 Cookies
集合之一。
示例¶
在此示例中,尝试通过比较服务器设置的 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);
}
}
参考¶
MSDN:HttpRequest.Item。
通用弱点枚举:CWE-348。