如何解决Delphi 中的缓冲区溢出漏洞
我很想知道,Delphi 是否容易受到缓冲区溢出攻击?我阅读了一些提到 Delphi 对该漏洞是安全的页面,因为“Delphi 可以使用 Pascal 字符串以及通用 Windows 字符串(PChar)。当与 Win API 交互时,除了使用 Pchar 之外别无选择”。 真的吗? 谢谢
解决方法
Delphi 是否容易受到缓冲区溢出攻击?
大多数语言都容易受到缓冲区溢出攻击。缓冲区溢出是编码错误,而不是语言缺陷。例如,在 Delphi 中:
var
buf: array[0..0] of Byte;
i: Integer;
begin
Move(buf,i,sizeof(i)); // buffer overflow!
PInteger(@buf)^ := i; // buffer overflow!
end;
如果您不小心的话,大多数语言都会让您射中自己的脚。编译器能做的只有这么多。并非所有事情都可以在编译时避免。编程不仅仅是编写可编译的代码,还包括编写在运行时正确且负责任地运行的代码。
某些语言可能会以在运行时执行边界检查的方式包装缓冲区,从而降低缓冲区溢出的风险。 Delphi 不是这些语言之一,因为它允许您直接对原始内存进行操作,因此您几乎可以做任何想做的事情(好吧,不管底层操作系统允许您做什么,无论如何)。对于 Pascal 字符串来说,这当然是正确的。
我阅读了一些提到 Delphi 对该漏洞是安全的页面,因为“Delphi 可以使用 Pascal 字符串以及通用 Windows 字符串 (PChar)。
Delphi 没有避免所有可能类型的缓冲区溢出的功能。但是,如果您编写代码以正确且理智地使用缓冲区,则不太可能发生溢出。这也不仅限于字符串。
当与 Win API 交互时,除了使用 Pchar 之外别无选择。这是真的吗?
这取决于特定的 API。大多数使用简单的以空字符结尾的 PChar
字符串,是的。但是有些人使用 UNICODE_STRING
记录代替,这些记录使用 WideChar
缓冲区,这些缓冲区不能保证以空字符结尾。有些使用 ActiveX/COM BSTR
(Delphi WideString
) 字符串。
Delphi 作为 IDE?可能是。作为语言?当然。自己判断:
var
s: String;
i: Integer;
begin
s:= 'four'; // Length of string: 4 characters
for i:= 1 to 1138 do begin // This loop goes WAY beyond the String's buffer
write( s[i] ); // What will it access after i=4?
end;
end;
需要 PChar
是因为 WinAPI 不是为 Pascal 构建的,但 Pascal 需要为 API 弯曲。缓冲区溢出是一个问题,但它不像 PChar
是放射性的,String
是耶稣 - 这取决于程序员不要过于愚蠢。
缓冲区溢出攻击与任何特定语言无关。只有当开发人员错误地编码了他的应用程序时,这些攻击才有可能发生。
简而言之,当使用来自外部的数据写入内存时,您作为开发人员有责任编写所有测试。编写时必须始终检查数据长度是否正确以适合。
对于 Delphi,有一些工具可以帮助检测缓冲区溢出(或下溢和许多其他错误)。例如madExcept。该工具不会阻止缓冲区溢出,如果您的程序溢出动态分配的缓冲区,它会立即阻止。这是一个不应在发布版本中交付的测试工具。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。