快速业务通道

缓冲区溢出还是问题吗?C++/CLI安全编码

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
的可能性,即使在打开/GS的情况下仍然存在。更重要的是,/GS选项不会检测堆中或数据段中的缓冲区溢出。

为举例说明,例2使用Win32 GUI重写了前面那个示例程序,这个程序提供一个带有一些简单选项的菜单栏--File菜单下有两个菜单项:"Login"和"Exit"。Login会用一个对话框来提示用户输入密码,一旦输入了密码,在用户点击"OK"按钮之后,将把输入的密码与之前记录的密码相比较。

例2:

1. #include "stdafx.h"
2. #include "TestItDan.h"
3. #include <stdlib.h>
4. #include <stdio.h>
5. #include <windows.h>
6. #define MAX_LOADSTRING 100
7. struct user {
8.  wchar_t *name;
9.  size_t len;
10. int uid;
11. };
13. HINSTANCE hInst;
14. TCHAR szTitle[MAX_LOADSTRING];
15. TCHAR szWindowClass[MAX_LOADSTRING];
16. TCHAR lpszUserName[16] = L"guest";
17. TCHAR lpszPassword[16] = L"0123456789abcde";
18. struct user *userP = (struct user *)0xcdcdcdcdcdcdcdcd;
19. size_t userNameLen = 16;
20. size_t userPasswordLen = 0xffffffff;
25. int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow) {
26.  UNREFERENCED_PARAMETER(hPrevInstance);
27.  UNREFERENCED_PARAMETER(lpCmdLine);
28.  MSG msg;
29.  HACCEL hAccelTable;
30.  LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
31.  LoadString(hInstance, IDC_TESTITDAN, szWindowClass, MAX_LOADSTRING);
32.  MyRegisterClass(hInstance);
33.  userP = (struct user *)malloc(sizeof(user));
34.  if (!InitInstance (hInstance, nCmdShow)) {
35.   return FALSE;
36.  }
37.  hAccelTable =LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTITDAN));
38.  while (GetMessage(&msg, NULL, 0, 0)) {
39.   if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
40.    TranslateMessage(&msg);
41.    DispatchMessage(&msg);
42.   }
43.  }
44.  return (int) msg.wParam;
45. }
109. INT_PTR CALLBACK GetPassword(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
110.  TCHAR lpszGuestPassword[16] = L"NCC-1701";
111.  UNREFERENCED_PARAMETER(lParam);
112.  switch (message) {
113.   case WM_INITDIALOG:
114.    return (INT_PTR)TRUE;
115.   case WM_COMMAND:
116.    if (LOWORD(wParam) == IDOK) {
117.     EndDialog(hDlg, LOWORD(wParam));
118.     SendDlgItemMessage(hDlg,
119.     IDC_EDIT1,
120.     EM_GETLINE,
121.     (WPARAM) 0, // line 0
122.     (LPARAM) lpszPassword
123.     );
124.     userP->len = userNameLen;
125.     if (wcscmp(lpszPassword, lpszGuestPassword) == 0) {
126.      return true;
127.     }
128.     else {
129.      MessageBox(hDlg,
130.       (LPCWSTR)L"Invalid Password",
131.       (LPCWSTR)L"Login Failed",
132.       MB_OK
133.      );
134.     }
135.     return (INT_PTR)TRUE;
136.    }
137.    break;
138.   }
139.   return (INT_PTR)FALSE;
140.  }

程序编译及测试的环境均与前例相同,除了在此使用了Unicode字符集及打开了缓冲区安全检查选项(/GS),

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号