<?php
/**
* Description of proxyConnector
*
* PHP5 class for interfacing php with the Tor network,
* the proxy host is fully configurable by the user,
* so the class is not limited to only the Tor
* network.
*
* by Marco Baldini <info@marcobaldini.com>
*
* Licensed: GNU General Public License, version 2 (GPLv2)
*
* The default setting however is to run
* through the Tor/Polipo network.
*
* New identity are changed using hashed password,
* remember to configure your Tor Proxy to allow this.
*
* @author Marco Baldini
*
* @copyright 2011 Marco Baldini
*
* @license GNU General Public License, version 2 (GPLv2)
*
* @version proxyConnector 1.1 TorVersion (28/01/2011)
*
* @example index.php
*
* Based on TOR Class by Josh Sandlin <josh@thenullbyte.org>
*/
class proxyConnector {
private static $instance;
private $destinationUrl;
private $userAgent;
private $timeout;
private $vector;
private $payload;
private $returnData;
private $ip;
private $port;
private $controlPort;
private $controlPassword;
private $switchIdentityAfterRequest = true;
##PUBLIC
public static function getIstance()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
/**
*
* SetUp the proxy configuration
*
* @param string $extIp Proxy Ip
* @param number $extPort Proxy Port
*/
public function setProxy($extIp="127.0.0.1", $extPort="8118")
{
$this->ip = $extIp;
$this->port =$extPort;
}
/**
*
* SetUp the control information
* used by a Tor proxy to renew identity
*
* @param string $extPort Proxy Ip
* @param number $extPassword Proxy Control Port
*/
public function setControlParameters($extPort, $extPassword)
{
$this->controlPassword = '"'.$extPassword.'"';
$this->controlPort = $extPort;
}
/**
*
* Request a remote url using Curl
*
* @param string $extUrl
* @param string $extVector
* @param number $extTimeout
*/
public function launch($extUrl, $extVector, $extTimeout = null)
{
//set parameters
$this->destinationUrl = str_replace(" ","%20",$extUrl);
$this->vector =$extVector;
$this->setUserAgent();
//set payload
$this->setPayload();
//if a timeout is set in the args, use it
if(isset($timeout))
{
$this->timeout = $extTimeout;
}
//run cURL action against url
$this->setCurl();
//renew identity
if ($this->switchIdentityAfterRequest) {
$this->newIdentity();
$this->setUserAgent();
}
}
/**
*
* Return downloaded data from the proxy
*
* @return array
* url: requested url
* userAgent: used userAgent
* timeout: used timeout
* proxy: proxy address
* payload: payload
* return: url content
*/
public function getProxyData()
{
return array(
'url' => $this->destinationUrl,
'userAgent' => $this->userAgent,
'timeout' => $this->timeout,
'proxy' => $this->ip .":". $this->port,
'payload' => $this->payload,
'return' => $this->returnData
);
}
/**
*
* Change identity in the Tor Network
* (change public IP Address)
*
* @return bool
* true is new identity is created
* false is fail creating a new identity
*/
public function newIdentity(){
$fp = fsockopen($this->ip, $this->controlPort, $errno, $errstr, 30);
if (!$fp) return false; //can't connect to the control port
fputs($fp, "AUTHENTICATE ".$this->controlPassword."\r\n");
$response = fread($fp, 1024);
list($code, $text) = explode(' ', $response, 2);
if ($code != '250') return false; //authentication failed
//send the request to for new identity
fputs($fp, "signal NEWNYM\r\n");
$response = fread($fp, 1024);
list($code, $text) = explode(' ', $response, 2);
if ($code != '250') return false; //signal failed
fclose($fp);
return true;
}
/**
* Load the default configuration for the proxy connection
* located in "proxyConfiguration.ini"
*/
public function loadDefaultSetUp() {
$loaded_ini_array = parse_ini_file("./proxyConfiguration.ini",TRUE);
$this->destinationUrl = null;
$this->userAgent = null;
$this->vector = null;
$this->payload = null;
$this->returnData = null;
$this->timeout = $loaded_ini_array["general"]["timeout"];
$this->ip = $loaded_ini_array["general"]["ip"];
$this->port = $loaded_ini_array["general"]["port"];
$this->controlPort = $loaded_ini_array["TOR"]["controlPort"];
$this->controlPassword = '"'.$loaded_ini_array["TOR"]["controlPassword"].'"';
$this->switchIdentityAfterRequest = $loaded_ini_array["TOR"]["switchIdentityAfterRequest"];
}
##PRIVATE
private function __construct() {
$this->loadDefaultSetUp();
}
private function setUserAgent()
{
//list of browsers
$agentBrowser = array(
'Firefox',
'Safari',
'Opera',
'Flock',
'Internet Explorer',
'Seamonkey',
'Konqueror',
'GoogleBot'
);
//list of operating systems
$agentOS = array(
'Windows 3.1',
'Windows 95',
'Windows 98',
'Windows 2000',
'Windows NT',
'Windows XP',
'Windows Vista',
'Redhat Linux',
'Ubuntu',
'Fedora',
'AmigaOS',
'OS 10.5'
);
//randomly generate UserAgent
$this->userAgent = $agentBrowser[rand(0,7)].'/'.rand(1,8).'.'.rand(0,9).' (' .$agentOS[rand(0,11)].' '.rand(1,7).'.'.rand(0,9).'; en-US;)';
}
private function setCurl()
{
$action = curl_init();
curl_setopt($action, CURLOPT_PROXY, $this->ip .":". $this->port);
curl_setopt($action, CURLOPT_URL, $this->payload);
curl_setopt($action, CURLOPT_HEADER, 1);
curl_setopt($action, CURLOPT_USERAGENT, $this->userAgent);
curl_setopt($action, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($action, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($action, CURLOPT_TIMEOUT, $this->timeout);
$this->returnData = curl_exec($action);
curl_close($action);
}
private function setPayload()
{
$this->payload = $this->destinationUrl . $this->vector;
}
private function __clone() {
trigger_error("Clonig not allowed");
}
}
|