我感兴趣的是,Delphi容易受到缓冲区溢出攻击吗?我读过一些页面,其中提到Delphi对漏洞是安全的,因为"Delphi可以使用Pascal字符串和通用windows字符串(PChar)。当与Win接口时,除了使用Pchar之外,没有其他选择“。这是真的吗?谢谢
发布于 2021-01-08 08:16:00
易受缓冲区溢出攻击吗?
大多数语言都容易受到缓冲区溢出攻击。缓冲区溢出是编码错误,而不是语言缺陷。例如,在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对接时,除了使用Pchar之外没有其他选择。这是真的吗?
这取决于特定的API。大多数都使用简单的以null结尾的PChar字符串。但有些使用的是UNICODE_STRING记录,这些记录使用的WideChar缓冲区不能保证以null结尾。有些则使用ActiveX/COM BSTR (Delphi WideString)字符串。
发布于 2021-01-08 08:04:37
Delphi作为集成开发环境?也许吧。作为语言?好的。自己判断:
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是耶稣-这取决于程序员不要太愚蠢。
发布于 2021-01-08 15:59:58
缓冲区溢出攻击与任何特定语言无关。只有当开发人员错误地编码他的应用程序时,这些攻击才可能发生。
简而言之,当内存从外部写入数据时,作为开发人员,您有责任编写所有测试。在写入数据时,您必须始终检查数据长度是否正确。
对于Delphi,有一些工具可以帮助检测缓冲区溢出(或下溢和许多其他错误)。例如madExcept。这个工具不能防止缓冲区溢出,如果你的程序溢出一个动态分配的缓冲区,它会立即防止。
https://stackoverflow.com/questions/65621454
复制相似问题