WEB开发网
开发学院网络安全黑客技术 如何阅读源代码(4) 阅读

如何阅读源代码(4)

 2006-07-04 20:27:38 来源:WEB开发网   
核心提示: 从parser.h头文件中就可以看到,这个函数是一个内部函数,如何阅读源代码(4)(3),这个函数把一行字符串中间的空格字符用''字符(结束字符)来代替,同时考虑了不替换在双引号,方括号,圆括号中间的空格字符以免得将一行数据错误的分隔开了

从parser.h头文件中就可以看到,这个函数是一个内部函数,这个函数把一行字符串中间的空格字符用''字符(结束字符)来代替,同时考虑了不替换在双引号,方括号,圆括号中间的空格字符以免得将一行数据错误的分隔开了。(请参考WEB日志的文件格式,可以更清楚的理解这一函数)
int parse_record_web(char *buffer)
{
  int size;
  char *cp1, *cp2, *cpx, *eob, *eos;
size = strlen(buffer); /* get length of buffer */
  eob = buffer+size; /* calculate end of buffer */
  fmt_logrec(buffer); /* seperate fields with 's */
/* HOSTNAME */
  cp1 = cpx = buffer; cp2=log_rec.hostname;
  eos = (cp1+MAXHOST)-1;
  if (eos >= eob) eos=eob-1;
while ( (*cp1 != '') && (cp1 != eos) ) *cp2++ = *cp1++;
  *cp2 = '';
  if (*cp1 != '')
  {
  if (verbose)
  {
   fprintf(stderr,"%s",msg_big_host);
   if (debug_mode) fprintf(stderr,": %s ",cpx);
   else fprintf(stderr," ");
  }
  while (*cp1 != '') cp1++;
  }
  if (cp1 < eob) cp1++;
/* skip next field (ident) */
  while ( (*cp1 != '') && (cp1 < eob) ) cp1++;
  if (cp1 < eob) cp1++;
/* IDENT (authuser) field */
  cpx = cp1;
  cp2 = log_rec.ident;
  eos = (cp1+MAXIDENT-1);
  if (eos >= eob) eos=eob-1;
while ( (*cp1 != '[') && (cp1 < eos) ) /* remove embeded spaces */
  {
  if (*cp1=='') *cp1=' ';
  *cp2++=*cp1++;
  }
  *cp2--='';
if (cp1 >= eob) return 0;
/* check if oversized username */
  if (*cp1 != '[')
  {
  if (verbose)
  {
   fprintf(stderr,"%s",msg_big_user);
   if (debug_mode) fprintf(stderr,": %s ",cpx);
   else fprintf(stderr," ");
  }
  while ( (*cp1 != '[') && (cp1 < eob) ) cp1++;
  }
/* strip trailing space(s) */
  while (*cp2==' ') *cp2--='';
/* date/time string */
  cpx = cp1;
  cp2 = log_rec.datetime;
  eos = (cp1+28);
  if (eos >= eob) eos=eob-1;
while ( (*cp1 != '') && (cp1 != eos) ) *cp2++ = *cp1++;
  *cp2 = '';
  if (*cp1 != '')
  {
  if (verbose)
  {
   fprintf(stderr,"%s",msg_big_date);
   if (debug_mode) fprintf(stderr,": %s ",cpx);
   else fprintf(stderr," ");
  }
  while (*cp1 != '') cp1++;
  }
  if (cp1 < eob) cp1++;
/* minimal sanity check on timestamp */
  if ( (log_rec.datetime[0] != '[') ||
   (log_rec.datetime[3] != '/') ||
   (cp1 >= eob)) return 0;
/* HTTP request */
  cpx = cp1;
  cp2 = log_rec.url;
  eos = (cp1+MAXURL-1);
  if (eos >= eob) eos = eob-1;
while ( (*cp1 != '') && (cp1 != eos) ) *cp2++ = *cp1++;
  *cp2 = '';
  if (*cp1 != '')
  {
  if (verbose)
  {
   fprintf(stderr,"%s",msg_big_req);
   if (debug_mode) fprintf(stderr,": %s ",cpx);
   else fprintf(stderr," ");
  }
  while (*cp1 != '') cp1++;
  }
  if (cp1 < eob) cp1++;
if ( (log_rec.url[0] != '"') ||
   (cp1 >= eob) ) return 0;
/* response code */
  log_rec.resp_code = atoi(cp1);
/* xfer size */
  while ( (*cp1 != '') && (cp1 < eob) ) cp1++;
  if (cp1 < eob) cp1++;
  if (*cp1<'0'||*cp1>'9') log_rec.xfer_size=0;
  else log_rec.xfer_size = strtoul(cp1,NULL,10);
/* done with CLF record */
  if (cp1>=eob) return 1;
while ( (*cp1 != '') && (*cp1 != ' ') && (cp1 < eob) ) cp1++;
  if (cp1 < eob) cp1++;
  /* get referrer if present */
  cpx = cp1;
  cp2 = log_rec.refer;
  eos = (cp1+MAXREF-1);
  if (eos >= eob) eos = eob-1;
while ( (*cp1 != '') && (*cp1 != ' ') && (cp1 != eos) ) *cp2++ = *cp1++;
  *cp2 = '';
  if (*cp1 != '')
  {
  if (verbose)
  {
   fprintf(stderr,"%s",msg_big_ref);
   if (debug_mode) fprintf(stderr,": %s ",cpx);
   else fprintf(stderr," ");
  }
  while (*cp1 != '') cp1++;
  }
  if (cp1 < eob) cp1++;
cpx = cp1;
  cp2 = log_rec.agent;
  eos = cp1+(MAXAGENT-1);
  if (eos >= eob) eos = eob-1;
while ( (*cp1 != '') && (cp1 != eos) ) *cp2++ = *cp1++;
  *cp2 = '';
return 1; /* maybe a valid record, return with TRUE */
}

上一页  1 2 3 4 5  下一页

Tags:如何 阅读 源代码

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接