工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > VC.net > 正文
VC++2005快速构建安全的应用程序
[文章信息]
作者:刘涛
时间:2005-03-21
出处:天极网
责任编辑:方舟
[文章导读]
本文针对微软的Visual C++2005发布版本中语言和库的一些新的特点进行了讨论,这将帮助你更高效地创作安全、可靠的代码
advertisement
热点推荐
· 妙用安装盘修复损坏的系统文件
· 删除系统顽固文件的十二招技巧
· “网络安全卫士2005”试用手记
· 多媒体教程:DW的安装与启动
· 多媒体系列教程:网页设计制作
[正文]

1 2 3  下一页

  内容提要:本文针对微软的Visual C++2005发布版本中语言和库的一些新的特点进行了讨论,这将帮助你更高效地创作安全、可靠的代码。

  一、 简介

  微软的Visual C++2005发布版本对于有志于轻松、迅速地编写安全可靠的应用程序的编程爱好者来说是正确地选择。正如你所听到的那样,Visual C++中语言和库的新特点使开发安全、可靠的应用程序比以前更容易。它即提供了功能强大并且灵活的标准C++,又提供了适于.NET框架下编程的最强大的开发语言。

  本文中,我主要探讨Visual C++2005发布版本中部分语言和库的新特色,无论是对于教学项目还是大的应用工程,这都将帮助你在编写安全可靠的代码时提高工作效率。

  二、C运行时库的安全特点

  如果你正在使用Visual C++创建使用C运行时库的应用程序,你将非常欣慰地了解到现在你所依赖的许多库函数都有了更安全的版本。对于需要一个或多个缓冲作为输入的函数来说,已经添加了长度参数,以此让函数来确信不会超越缓冲的边界。现在更多的函数开始对参数进行合法性检查,必要时将调用无效参数处理器。让我们来看一些简单的例子:

  C运行时库中最不可靠的是gets函数,它从标准输入中读取一行。思考下面的一个简单的例子:

char buffer[10] = { 0 };
gets(buffer);

  第一行代码声明了一个缓冲变量,并将缓冲区中的字符初始化设置为0。为避免意外情况发生将变量初始化为一个众所周知的值是一个非常好的主意。紧接着,看似清白无辜的gets函数从标准的输入流中读取一行并且写入到buffer缓冲区内。这有什么错误吗?对于函数来说C类型的数组不能实现值传递,而是传递了指向数组第一个元素的指针。所以在函数看来,char[ ]相当于char*指针,并且是一个不附带可以决定所指向的缓冲区大小尺寸的任何额外信息的原始指针。那么gets函数是怎么作的呢?它假设缓冲区无限大(UINT_MAX 是有精确尺寸的),并将持续地从输入流中拷贝字符到缓冲区内。攻击者可以轻易地使用这个弱点,这种不广为人知的类型错误被称为缓冲溢出。

  很多最初的C运行时库函数遭受同样的与参数确认有关的问题,并且现在因此受到抨击。一定要牢记对于当前所要写的应用程序来说,性能处于次要地位,我们现在生活在一个安全第一的世界。每一个受到批评的函数已经被一个提供同样函数功能,但添加了安全特点的函数所代替。当然,根据你在已经存在的代码中所使用的旧的库函数的多少,你可能需要花费一些时间来代码更替到新的、更安全的版本。这些新的函数有一个_s后缀,例如,gets函数被gets_s函数代替;遭受抨击的strcpy函数被strcpy_s函数代替。这里有一个例子:

char buffer[10] = { 0 };
gets_s(buffer, sizeof (buffer) / sizeof (buffer[0]));

  gets_s函数有一个额外的参数,用来显示可以写入的最大字符数量,这里包括一个NULL终结符。我使用了sizeof操作符,它能决定数组的长度,因为编译器在编译时决定sizeof操作符返回的结果。记住,sizeof返回操作数的长度是以字节为单位的,所以用数组长度来除以数组中第一个元素的长度将返回数组中元素的个数。这种简单的方法可以移植到Unicode编码下使用_getws_s的情况,这个函数也需要得知以字节为单位的缓冲区长度。

  正如我所提到的,另外一个接受安全检查的常用函数strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。在程序运行时,这将导致不可预料的行为,正如我所提到的,为了安全需要避免这些不可预料的行为,这有一个使用安全的strcpy_s函数的例子。

char source[] = "Hello world!";
char destination[20] = { 0 };
strcpy_s(destination, sizeof (destination) / sizeof (destination[0]), source);

  有很多原因来喜欢这个新的strcpy_s函数。最明显的区别是的额外的、以字节为单位的参数,它用来确认缓冲区大小。这允许strcpy_s函数可以进行运行时检查,以确定写入的字符没有超过目标缓冲区的边界。还有一些其它的检查方法来确定参数的有效性。在调试版本中这些检测方法,包括显示调试报告的"断言"(assertions)方法,如果它们的条件没有满足,它们将显示调试报告。无论是调试还是发行版本,如果一个特定的条件没有得到满足,一个无效的参数管理器将被调用,它默认的行为是抛出一个访问冲突来终止应用程序。这非常好的实现了让你的应用程序持续运行,而不会产生不可预期的结果。当然,这种情况完全可以通过确保类似于strcpy_s的函数不调用无效参数来避免。

  前一个例子可以通过新的_countof宏来进一步简化,这个宏移抛开了对有错误倾向的sizeof操作符的需要。_countof宏返回C类型数组的元素数量。这个宏本身对应了一个模版,如果传递一个原始指针的话,它将无法通过编译。这有一个例子:

strcpy_s(destination, _countof(destination), source);


1 2 3  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 完美的C++:C++/CLI
  • 体验Visual Studio 2005中C++语言
  • 超越C++:下一代C++——C++/CLI简介
  • Visual C++ 2005中混合代码的初始化
  • 体验Visual C++.NET 2005中的STL
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 【315】华硕笔记本电脑漏电 存在设计缺陷
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • Advertisement

    天极无线
    经典名曲 华语流行 欧美风情 人声音效 原声大碟
    你好周杰伦-安又琪
    直线-张韶涵
    天边-张韶涵
    看我72变-蔡依林
    乱世佳人-Twins
    全世界下雨-张娜拉
    我们的爱-飞儿乐队
    分手快乐-梁静茹
    爱在西元前-周杰伦
    三万英尺-迪克牛仔
    爱如潮水-张信哲
    爱情宣言-齐秦
    寻找玛依拉-刀郎
    驼铃-刀郎
    老鼠爱大米-杨臣刚
    功夫主题曲
    仙剑主题曲杀破狼
    天下无贼片尾曲
    冲动的惩罚-刀郎
    情人-刀郎
    爱情-莫文蔚
    挪威的森林-伍佰
    奔跑 - 羽泉
    因为爱 - 羽泉
      ·时尚女人圈
    ·经典影视专集
    ·美女秀场
    ·美丽大自然专题
    ·流行金曲
    ·科幻电影特区
    | 最新推荐
    ·你好周杰伦
    ·杀破狼
    ·寻找玛依拉
    ·孤单公园
    ·男人海洋
    | 魔术铃声
    ·少女丰胸
    ·少妇丰胸
    ·减肥魔铃
    ·增高魔铃
    ·美容魔铃

    今日报价查询 更多报价