一个字符串长度越界攻击的例子,求解决方法
时间: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会根据实际传入的参数的长度限制进行截取,但是这样的代码执行效率会有影响。
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28