+ -
当前位置:首页 → 问答吧 → 一个字符串长度越界攻击的例子,求解决方法

一个字符串长度越界攻击的例子,求解决方法

时间:2011-11-22

来源:互联网

function ReadShortStr(Var s:ShortString):Integer;
var
  B:Byte;
begin
  result := ReadByte(B); //读字符串长度
  SetLength(s);
  result := result + ReadBytes(s[1],B); //读字符串内容
end;

说明:ReadShortStr函数的用处是从某处(例如流中)读取一个短字符串,并返回读取的字节数。
某处调用:
Var
  AStr:String[20];
begin
  ReadShortStr(AStr);
end;

问题:如果ReadShortStr中B的值超过20,则ReadShortStr(AStr)调用会产生字符串越界。

解决方案一:
Var
  AStr:ShortString;
通过取消字符串变量的长度限制(也就是限制改为最大的255),可以确保不会越界,但是,很多时候我们希望定义变量时能明确其最大长度。

解决方案二:
function ReadShortStr(Var s:ShortString):Integer;
var
  B:Byte;
  TmpStr:ShortString;
begin
  result := ReadByte(B); //读字符串长度
  SetLength(TmpStr);
  result := result + ReadBytes(TmpStr[1],B); //读字符串内容
  s:=TmpStr;
end;
通过一个确保不会越界的中间变量TmpStr来保存实际读取的数据,然后s:=TmpStr会根据实际传入的参数的长度限制进行截取,但是这样的代码执行效率会有影响。


作者: xyfate   发布时间: 2011-11-22

中间转接一次,必然要花费时间

作者: bdmh   发布时间: 2011-11-22

安全就是要付出代价的

作者: sz_haitao   发布时间: 2011-11-22