Jump to content

Help making a php proxy


Picatta

Recommended Posts

So, I'm trying to make a new proxy in php.  However, a problem I've run into is that it can't handle biary data.  I'm thinking it is with the way I'm filtering the headers, but I'm not shure...  (heres an example: http://multithreading.ath.cx:24/myproxy/proxy.php?page=http://www.mixfevers.com)

Whenver I try to proxify an image, I get

[quote]The image “http://localhost:24/myproxy/proxy.php?page=http://mixfevers.com/main/includes/images/block2.gif” cannot be displayed, because it contains errors.[/quote]

I'm not shure what to do...

[code]
<?php
  if (!function_exists(str_ireplace)) {
    function str_ireplace($repit,$repl,$src) {
      return str_replace(strtolower($repit), strtolower($repl), strtolower($src));
    }
  }
  function encode($url) {
    $old = array('://', 'page=', '?', '=', 'q');
    $new = array('<[pro]>', '<[pgespchr]>', '<[qmark]>', '<[eqmark]>', '<[qchr]>');
    $url = str_ireplace($old, $new, $url);
    return $url;
  }
  function decode($url) {
    $old = array('://', 'page=', '?', '=', 'q');
    $new = array('<[pro]>', '<[pgespchr]>', '<[qmark]>', '<[eqmark]>', '<[qchr]>');
    $url = str_ireplace($new, $old, $url);
    return $url;
  }
  if (!isset($_GET['page'])) {
    if (!isset($_GET['browse'])) {
      print "
        <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">
          <html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\">
            <head>
              <!--
                Web proxy by Coprolal1an/Picatta/Alex Ray/minihacker316/Cracked.Anarchist
              //-->
              <title>
                A simple web mirror script
              </title>
            </head>
            <body>
              <form action='?browse' method='GET'>
                <div id='form'>
                  URL:  <input type='text' name='q' /><br /><br />
                  <input type='submit' value='browse' />
                  <input type='hidden' name='browse' />
                </div>
              </form>
            </body>
          </html>
      ";
    } else {
      //Print frame page
      $page = $_GET['q']; //Get the requested page
      print "
        <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">
          <html xmlns=\"http://www.w3.org/1999/xhtml\">
            <head>
              <title>
                A simple web proxy
              </title>
            </head>
            <frameset rows='5%,*' scrolling='auto' border='0'>
              <frame src='?page&header' />
              <frame src='?page=" . encodeurl($page) . "' />
              <noframes>
                <body>
                  myProxy web proxy by Coprolal1an requires a frame-enabled browser such as Firefox.
                </body>
              </noframes>
            </frameset>
          </html>
      ";
    }
  } elseif ((isset($_GET['page'])) AND (!isset($_GET['header']))) {
    //Print requested page
    $page = decode($_GET['page']); //Get the page the user requested
    $page = explode('://', $page);
    $prefix = $page[0];
    $page = $page[1];
    $page = explode('/', $page, 2);
    $host = explode('.', $page[0]);
    if (strpos($host[0], 'www') !== FALSE) {
      unset($host[0]);
    }
    $host = implode('.', $host);
    $path = '/' . $page[1];
    if ($prefix == 'https') {
      $port = 443;
      $pre = 'ssl://www.';
    } else {
      $port = 80;
      $pre = 'www.';
    }
    $fp = fsockopen($pre . $host, $port, $errno, $errstr, 30);
    if (!$fp) {
      echo "$errstr ($errno)<br />\n";
    } else {
      $out = "GET $path HTTP/1.1\r\n";
      $out .= "Host: $pre$host\r\n";
      $out .= "Connection: Close\r\n\r\n";
      fwrite($fp, $out);
      while (!feof($fp)) {
          $buffer .= fgets($fp, 128);
      }
      fclose($fp);
      $buffer = explode('<', $buffer);
      $header = $buffer[0];
      $header = preg_split("/\n/", $header);
      $lines = count($header);
      for ($int=0; $int<$lines; $int++) {
        $line = $header[$int];
        if (!empty($line) AND
            (strpos($line,'Transfer-Encoding') === FALSE) AND
            (strpos($line,'Location:') === FALSE) AND
            (strpos($line,'location:') === FALSE))
        {
          header($line);
          //print $line;
        }
      }
      $buffer[0] = "\n";
      $buffer = implode('<', $buffer);
      $buffer = explode('0', $buffer);
      $end = count($buffer)-1;
      unset($buffer[$end]);
      $buffer = implode('0', $buffer);
      $buffer = preg_replace("/(http|https):\/\/(.*?)('|\"| )/", ("?page=$1://$2$3"), $buffer);
      print $buffer;
    }
  } else {
    print "Proxified page below<br />";
  }
?>
[/code]

It uses frame because I figured that would be easiest.

NOTE; The encode and decode functions will eventually be for parsing urls.
Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.