两个不同的连接处理程序调用中的相同指针地址

时间:2012-11-30 14:30:09

标签: url-rewriting g-wan

我正在重写网址并用围攻进行测试,我遇到了一个问题。

有时,gwan在处理程序连接中使用相同的地址进行2次main函数调用。 为了在两次调用之间产生差异,我使用带有rand()的整数。

在下面的例子中,我们发现2个电话的地址非常接近......

init 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

init 687109171 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

regex OK 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

extarctPart 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

regex OK 687109171 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

rewriteJPG 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew-100018-imagesgallery/BIG-1.jpg HTTP/1.1

xbufreplace 1412811699 : buff 0x10d3760 -> GET /imagesproduitnew/imagesgallery/BIG/100018.jpg HTTP/1.1

-- HERE buffer is changed by the previous step because both have the same address -- 
extarctPart 687109171 : buff 0x10d3760 -> GET /imagesproduitnew/imagesgallery/BIG/100018.jpg HTTP/1.1

要解决此问题,我使用来自其他服务器的siege,其中列出了不同的URL。

感谢您的帮助


我需要重写网址: /-100018-imagesgallery/BIG-1.jpg必须发送到文件/imagesproduitnew/imagesgallery/BIG/100018.jpg

我的代码:

int main(int argc, char *argv[])
{
  const long state = (long)argv[0];
  if(state == HDL_AFTER_READ)
  {
    int test = rand();

    xbuf_t *read_xbuf = (xbuf_t*)get_env(argv, READ_XBUF);
    printf ("init %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);


    //function to test if URL needs to be rewrite
    if(regexRewriteJPG(read_xbuf->ptr) == 0){
      printf ("regex OK %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);

      char *URL;
      char *newURL;
      //extractPart, extract the URL from buffer (/imagesproduitnew-100018-imagesgallery/BIG-1.jpg for exemple)
      URL = extractPart(read_xbuf->ptr, str_regexJPG);
      printf ("extarctPart %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);
      if(URL){
        //rewriteJPG return the reel path of the file (/imagesproduitnew/imagesgallery/BIG/100018.jpg for exemple)
        newURL = rewriteJPG(URL);
        printf ("rewriteJPG %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);
        if(newURL){
          xbuf_repl(read_xbuf, URL, newURL);
          printf ("xbufreplace %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);
          free(newURL);
        }
        else{
          printf("newURL is NULL\n");
        }
        free(URL);
      }
      else{
        printf("URL is NULL\n");
      }
    }
    printf ("END %i : buff %p -> %s\n", test, read_xbuf->ptr, read_xbuf->ptr);
  }
return 255; // execute next connection 
}

2 个答案:

答案 0 :(得分:2)

自定义处理程序变量的printf()转储肯定有意义......一旦有权访问处理程序的源代码。

如果通过“处理程序连接中的主函数2调用相同的地址”,则表示READ_XBUF地址,请记住:

  • G-WAN内部缓冲区可以即时重复使用以处理请求(它们在连接的生命周期内不会附加)。

  • printf()将显示连续(以及并发)连接

  • 使用计时器不会让您知道请求是并发还是顺序的,直到您处理处理程序中每个处理步骤的开始和停止为止。

这可以解释在您的情况下地址是相同的。

更一般地说,在描述问题时,请尝试声明:

  1. 您正在使用的输入(数据示例)
  2. 你想做什么(简短说明)
  3. 你是如何做到的(源代码)
  4. 您未获得的预期输出
  5. 您获得的输出。
  6. 这将有助于其他人回答您的问题。

答案 1 :(得分:2)

只是一个评论,但您的网址映射:

/-100018-imagesgallery/BIG-1.jpg 

...比你的文件系统目标更少的逻辑和更少的RESTFUL:

/imagesproduitnew/imagesgallery/BIG/100018.jpg

...因为它破坏了资源的层次结构。

此外,使用文件系统映射可以避免使用慢速RegEx库的障碍。

我并不是说你“做错了”,我只是指出有很多方法可以实现你的目标,而不必解决这个不直观的URI映射所造成的问题。 / p>

如果确实需要在URI中反转"100018""imagesgallery",那么无需使用RegEx就可以更轻松,更快速地执行此操作。

如果此URI映射旨在将真实PATH隐藏到资源,则使用类似以下URI的内容:

/imagesproduitnew/imagesgallery/BIG/100018.jpg 

由这样的处理程序修改:

/imagesproduitnew/imagesgallery/BIG/957345.jpg 

转换可以通过非常简单的操作就地完成,例如对资源名称进行异或操作。

这就是为什么在尝试做一些不一定是最佳解决方案的事情之前质疑初始目标是个好主意。