Function.cpp
上传用户:apgaozhao
上传日期:2022-04-17
资源大小:69k
文件大小:6k
开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include ".function.h"
  3. CFunction::CFunction(HMODULE h)
  4. {
  5. char Path[MAX_PATH],Path2[MAX_PATH];
  6. HANDLE hFile;
  7. DWORD len;
  8. hModule=h;
  9. GetFilePath(Path,MAX_PATH);
  10. strcpy(Path2,Path);
  11. strcat(Path2,"Setting.ini");
  12. hFile=CreateFile(Path2,GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,0,NULL);
  13. if(hFile==INVALID_HANDLE_VALUE)
  14. {
  15. Sql="exec|insert|select|delete|update|chr|mid|master|truncate|declare|'";
  16. dbgprint_str("读取配置文件错误!","");
  17. }
  18. else
  19. {
  20. len=GetFileSize(hFile,0);
  21. char *temp=new char[len];
  22. string temp2;
  23. ReadFile(hFile,temp,len,&len,0);
  24. CloseHandle(hFile);
  25. if(!GetField(temp,"sql=",0,len,Sql))
  26. Sql="exec|insert|select|delete|update|chr|mid|master|truncate|declare|'";
  27. if(!GetField(temp,"sqlkeytimes=",0,len,temp2))
  28. temp2="1";
  29. SqlInjectKeyTimes=atoi(temp2.c_str());
  30. dbgprint_str("sqlkeytimes:",temp2.c_str());
  31. dbgprint_str("Sql:",Sql.c_str());
  32. InitIpList(temp);
  33. delete []temp;
  34. }
  35. strcpy(Path2,Path);
  36. strcat(Path2,"FireWall.log");
  37. hLogFile=CreateFile(Path2,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ, NULL,OPEN_ALWAYS,0,NULL);
  38. SetFilePointer(hLogFile,0,0,FILE_END);
  39. }
  40. CFunction::~CFunction(void)
  41. {
  42. CloseHandle(hLogFile);
  43. }
  44. bool CFunction::IsAllowIpPath(const char *Ip,const char *Url)
  45. {
  46. int size=IpList.size();
  47. for(int i=0;i<size;i++)
  48. {
  49. //dbgprint_str("IsAllowIpPath IP:",IpList[i].Ip);
  50. if(CompareStr(Ip,IpList[i].Ip,strlen(IpList[i].Ip)))
  51. {
  52. dbgprint_str("找到对应IP:",IpList[i].Ip);
  53. if(IpList[i].AllowPath=="")
  54. {
  55. return (IpList[i].DenyPath=="*")?false:(!IsUrlIn(IpList[i].DenyPath,Url));
  56. }
  57. else
  58. {
  59. return (IpList[i].AllowPath=="*")?true:IsUrlIn(IpList[i].AllowPath,Url);
  60. }
  61. }
  62. }
  63. dbgprint_str("IP:","没找到对应IP");
  64. return false;//配置文件有问题 少默认处理项
  65. }
  66. bool CFunction::GetFilePath(char *Path,DWORD len)
  67. {
  68. DWORD i;
  69. i=GetModuleFileName(hModule,Path,len);
  70. if(i>0)
  71. {
  72. for(;i>0;i--)
  73. {
  74. if(Path[i]=='\')
  75. {
  76. Path[i+1]='';
  77. break;
  78. }
  79. }
  80. return true;
  81. }
  82. else
  83. return false;
  84. }
  85. bool CFunction::IsSqlInject(const char *QueryStr,string &SqlStr)
  86. {
  87. int times=0;
  88. DWORD i=0,j;
  89. string temp;
  90. SqlStr="";
  91. while(i!=-1)
  92. {
  93. if(i==0)i=-1;//第一次循环
  94. j=Sql.find("|",i+1);
  95. if(j==-1)
  96. {//结尾
  97. temp=Sql.substr(i+1,Sql.length()-i-1);
  98. if(strstr(QueryStr,temp.c_str()))
  99. {
  100. SqlStr=SqlStr+temp+"|";
  101. times++;
  102. }
  103. else
  104. {//中间一段
  105. temp=Sql.substr(i+1,j-i-1);
  106. if(strstr(QueryStr,temp.c_str()))
  107. {
  108. SqlStr=SqlStr+temp+"|";
  109. times++;
  110. }
  111. }
  112. i=j;
  113. }
  114. dbgprint_str("SqlStr:",SqlStr.c_str());
  115. if(times>=SqlInjectKeyTimes)
  116. {
  117. SqlStr=SqlStr.substr(0,SqlStr.length()-1);
  118. return true;
  119. }
  120. return false;
  121. }
  122. bool CFunction::IsUrlIn(string Path,const char *Url)
  123. {
  124. DWORD i=0,j;
  125. string temp,temp2;
  126. temp2=Url;
  127. for(i=strlen(Url)-1;i>=0;i--)
  128. {
  129. if(Url[i]=='/')
  130. {
  131. temp2=temp2.substr(0,i);
  132. break;
  133. }
  134. }
  135. if(temp2.length()==0)
  136. temp2="/";
  137. dbgprint_str("IsUrlIn temp2:",temp2.c_str());
  138. i=0;
  139. while(i!=-1)
  140. {
  141. if(i==0)i=-1;//第一次循环
  142. j=Path.find("|",i+1);
  143. if(j==-1)
  144. {//结尾
  145. temp=Path.substr(i+1,Path.length()-i-1);
  146. dbgprint_str("IsUrlIn temp:",temp.c_str());
  147. if(CompareStr(temp2.c_str(),temp.c_str(),temp.length()))
  148. return true;
  149. }
  150. else
  151. {//中间一段
  152. temp=Path.substr(i+1,j-i-1);
  153. dbgprint_str("IsUrlIn temp:",temp.c_str());
  154. if(CompareStr(temp2.c_str(),temp.c_str(),temp.length()))
  155. return true;
  156. }
  157. i=j;
  158. }
  159. return false;
  160. }
  161. bool CFunction::WriteLog(const char *Ip,const char *Text)
  162. {
  163. DWORD len=strlen(Ip)+strlen(Text)+20;
  164. char Time[20];
  165. char *buff=new char[len];
  166. _strtime(Time);
  167. len=sprintf(buff,"%s %s %srn",Time,Ip,Text);
  168. WriteFile(hLogFile,buff,len,&len,0);
  169. delete buff;
  170. return true;
  171. }
  172. bool CFunction::IsBaoKu(const char *Url)
  173. {
  174. if(strstr(Url,"\"))
  175. return true;
  176. else
  177. return false;
  178. }
  179. bool CFunction::InitIpList(const string text)
  180. {
  181. tagIpList NewList;
  182. int i,j=0;
  183. i=text.find("[ip=");
  184. (i>=0)?j=text.find("]",i):j=-1;
  185. //dbgprint_num("i:",i);
  186. //dbgprint_num("j:",j);
  187. while(i!=-1&& j!=-1)
  188. {
  189. string temp;
  190. strcpy(NewList.Ip,text.substr(i+4,j-i-4).c_str());
  191. dbgprint_str("Ip:",NewList.Ip);
  192. GetField(text,"allowpath=",j+3,text.length(),NewList.AllowPath);
  193. dbgprint_str("AllowPath:",NewList.AllowPath.c_str());
  194. GetField(text,"denypath=",j+3,text.length(),NewList.DenyPath);
  195. dbgprint_str("DenyPath:",NewList.DenyPath.c_str());
  196. IpList.push_back(NewList);
  197. i=text.find("[ip=",j+3);
  198. (i>=0)?j=text.find("]",i):j=-1;
  199. //dbgprint_num("i:",i);
  200. //dbgprint_num("j:",j);
  201. }
  202. return true;
  203. }
  204. bool CFunction::GetField(const string Text,const char *Field,int start,int end,string &value)
  205. {
  206. int i,j;
  207. i=Text.find(Field,start);
  208. if(i==-1 || i>end)
  209. {
  210. value="";
  211. return false;
  212. }
  213. j=Text.find("rn",i);
  214. if(j==-1)
  215. value=Text.substr(i+strlen(Field));
  216. else
  217. value=Text.substr(i+strlen(Field),j-i-strlen(Field));
  218. return true;
  219. }
  220. bool CFunction::CompareStr(const char *str1,const char *str2,int len)
  221. {
  222. int     n;
  223. int     num;   
  224. const char   *s;   
  225. if(!str1||!str2)
  226. return   false;   
  227. num=len<0?strlen(str2):len;
  228. for(;*str2&&num;num-=n)
  229. {
  230. if(*str2=='?')
  231. {
  232. if(*str1=='')   
  233. return false;   
  234. str2++;
  235. str1++;
  236. n=1;
  237. continue;   
  238. }
  239. if(*str2!='*'){
  240. if(*str2!=*str1)   
  241. return false;   
  242. str2++;
  243. str1++;   
  244. n=1;
  245. continue;
  246. }
  247. while(*str2=='*')   
  248. {
  249. num--;
  250. str2++;   
  251. if(num==0)
  252. return 1;   
  253. }
  254. if(*str2=='')   
  255. return true;   
  256. s=strchr(str2,'*');   
  257. if(s!=NULL)   
  258. n=s-str2;   
  259. else
  260. n=strlen(str2);   
  261. for(;*str1;str1++)
  262. {   
  263. if(CompareStr(str1,str2,n))   
  264. break;   
  265. }   
  266. if(*str1=='')   
  267. return false;   
  268. str2+=n;
  269. str1+=n;   
  270. }   
  271. return num==0&&(*str1==0);  
  272. }