p; * pdblVal; // VT_BYREF|VT_R8. VARIANT_BOOL * pboolVal; // VT_BYREF|VT_BOOL. _VARIANT_BOOL * pbool; SCODE * pscode; // VT_BYREF|VT_ERROR. CY * pcyVal; // VT_BYREF|VT_CY. DATE * pdate; // VT_BYREF|VT_DATE. BSTR * pbstrVal; // VT_BYREF|VT_BSTR. IUnknown ** ppunkVal; // VT_BYREF|VT_UNKNOWN. IDispatch ** ppdispVal; // VT_BYREF|VT_DISPATCH. SAFEARRAY ** pparray; // VT_ARRAY|*. VARIANT * pvarVal; // VT_BYREF|VT_VARIANT. PVOID * byref; // Generic ByRef. CHAR cVal; // VT_I1. USHORT uiVal; // VT_UI2. ULONG ulVal; // VT_UI4. ULONGLONG ullVal; // VT_UI8. INT intVal; // VT_INT. UINT uintVal; // VT_UINT. DECIMAL * pdecVal // VT_BYREF|VT_DECIMAL. CHAR * pcVal; // VT_BYREF|VT_I1. USHORT * puiVal; // VT_BYREF|VT_UI2. ULONG * pulVal; // VT_BYREF|VT_UI4. ULONGLONG * pullVal; // VT_BYREF|VT_UI8. INT * pintVal; // VT_BYREF|VT_INT. UINT * puintVal; // VT_BYREF|VT_UINT. (表1)
这里还有一个重要的值VT_NULL,它表示数据库中相应字段的数据为空。一些控件上无法处理VT_NULL的情况,例如:ListCtrl。如果使用ListCtrl对数据进行显示,可以考虑用下面的方法进行判断: if(rs->GetCollect("user").vt == VT_NULL) // record is null else // record is non-null
三 安全问题 现在流行SQL INJECTION,因此对于字符串的过滤是一个很重要的问题。 如果是用VB来做这样的程序,可以很容易的实现,VB中的字符串操作是很容易的,还可以使用VBSCRIPT中的正则表达式(VC中也可以使用VBSCRIPT中的正则表达式,然而方法我忘记了,记得Codeproject中有相关的文章。或者使用现成的库如BOOST,greta)。 如果不会正则表达式,也可以用下面的方法:
// // 检查指定字符串中是否包含非法字符 // BOOL StrCheck(LPCTSTR lpszString) { CString strKey = "\''''\\\"%#|=+-)(,.?/">*&^$@!`~:;<>,.?/"; int len = strlen(lpszString);
for(int i = 0; i < len; i++) { for(int j = 0; j < strKey.GetLength(); j++) { if(lpszString[i] == strKey.GetAt(j)) return FALSE; } }
return TRUE; }
如果程序的输入需要用到"''''"或"""这两个符号的话,还应该进行相应的转换。 // // 对于ACCESS和MSSQL // strUser.Replace("\''''", "\''''\''''"); strUser.Replace("\"", "\"\"");
// // 对于MySQL // strUser.Replace("\''''", "\\\''''"); strUser.Replace("\"", "\\\""); 对于使用搜索的话,还需要过滤掉"_"和"#",经过上面几步才能保证SQL INJECTION发生的几率减少。 对于多用户的系统,应该使用MD5的方法将登录的密码进行加密。 尽量不要使用ACCESS作为开发使用的数据库,其安全性实在是太差,即便是加了密码,也可以轻松在本地破解出来。推荐使用MySQL或者是MSSQL。
上一页 [1] [2] |