Web应用程序的威胁与对策(11)
时间:2025-07-09
时间:2025-07-09
标准化
下一部分将详细说明这些漏洞,包括使其成为可能的原因。
缓冲区溢出
缓冲区溢出漏洞会导致拒绝服务攻击或代码插入。拒绝服务攻击会引起进程崩溃;代码插入则会更改程序执行地址以运行攻击者插入的代码。下面的代码片段演示了缓冲区溢出漏洞的典型示例。
复制代码
void SomeFunction( char *pszInput )
{
char szBuffer[10];
// 当不执行类型检查时,输入将直接复制到缓冲区内
strcpy(szBuffer, pszInput);
. . .
}
托管的 .NET 代码不容易受到此问题的影响,因为不论何时访问数组时,都会自动检查数组界限。这使得缓冲区溢出攻击的威胁对托管代码而言并不构成很大的问题。但是,当托管代码调用非托管的 API 或 COM 对象时,它仍是个要考虑的问题。 有助于防止缓冲区溢出的对策包括:
执行彻底的输入验证。这是防御缓冲区溢出的第一道防线。尽管应用程序可能存在缺陷,使得期望的输入超出容器的界
限,但不期望的输入仍将成为产生这种漏洞的主要原因。通过验证输入的类型、长度、格式和范围来限制输入。
在可能的情况下,限制应用程序对非托管代码的使用,并彻底检查非托管的 API,以确保输入已经过正确的验证。 检查调用非托管的 API 的托管代码,以确保仅将合适值作为参数传递给非托管的 API。 使用 /GS 标记来编译使用 Microsoft Visual C++® 开发系统开发的代码。/GS 标记将使编译器向编译代码中插入
安全检查。这并非无错的解决方案或是对您特定的验证代码的替换;但是,它确实能保护您的代码免受众所周知的缓冲区溢出攻击。有关更多信息,请参阅 .NET Framework 产品文档,网址为:
/library/default.asp?url=/library/en-us/vccore/html/vclrfGSBufferSecurity.asp(英文)和 Microsoft 知识库文章 325483“Support WebCast:Compiler Security Checks:The /GS compiler switch”,网址为:/default.aspx?scid=325483(英文)。
通过缓冲区溢出插入代码示例
攻击者可以利用缓冲区溢出漏洞来插入代码。通过这种攻击,恶意用户可以在进程中利用未检查的缓冲区,方法是提供精心构造的输入值来覆盖程序的堆栈,并更改函数返回地址。这会使执行跳到攻击者插入的代码。