2012-02-11 2 views
10

Хорошо, вот что мне нужно. У меня есть веб-искатель на основе PHP. Доступно здесь: http://rz7ocnxxu7ka6ncv.onion/ Теперь моя проблема в том, что мой паук, который на самом деле сканирует страницы, должен делать это на порту SOCKS 9050. Дело в том, что мне нужно туннелировать его соединение через Tor, чтобы он мог разрешить .onion доменов, что я индексирую. (Только заканчивается на .onion.) Я вызываю этот скрипт из командной строки, используя php crawl.php, и добавляю соответствующие параметры для обхода страницы. Вот что я думаю: Есть ли способ заставить его использовать Tor? ИЛИ Могу ли я заставить свою ПОЛНОСТЬЮ МАШИНА прокладывать туннели через Тор, и как? (Как заставить весь трафик через 127.0.0.1:9050) возможно, если я настрою глобальные настройки прокси-сервера, php будет их уважать?Tor Web Crawler

Если какое-либо из моих решений работает, как бы я это сделал? (Пошаговые инструкции, пожалуйста, я noob.)

Я просто хочу собрать свою собственную поисковую систему Tor. (Не рекомендую мои поисковые системы p2p - это не то, что я хочу для этого - я знаю, что они существуют, я сделал домашнее задание.) Вот источник искателя, если вы заинтересованы взглянуть на: Возможно, кто-то с доброе сердце может изменить его, чтобы использовать 127.0.0.1:9050 для всех запросов на сканирование? http://pastebin.com/kscGJCc5

+0

«возможно, если бы я установил глобальные настройки прокси-сервера, php будет их уважать?» Сомнительно. Не 'fopen ($ url)'. Используйте cURL с 'CURLOPT_PROXY'. Не знаете, как работают поисковые запросы DNS. –

+0

Как это сделать? В этом я полный ноб. – user1203301

ответ

9

Если я что-то не получил, да, и here is some documentation на сайте Tor. Инструкции довольно конкретны. Хотя я не задал Tor в качестве прокси-сервера, это то, что я рассмотрел, это место, которое я бы начал.

EDIT: Это мертвый простой для установки Tor на Linux и использования его в качестве прокси-сервера, как предлагает документация.

sudo apt-get install tor 
sudo /etc/init.d/tor start 

netstat -ant | grep 9050 # verify Tor is running 

Теперь после просмотра OPS кода мы видим призывы к file_get_contents. Хотя самый простой способ использовать сначала file_get_contents становится громоздким, если вы хотите начать параметризацию запроса, потому что вам нужно использовать stream contexts.

Первое предложение состоит в том, чтобы перейти на curl, но опять же, больше информации о том, как SOCKS работает с HTTP, является вероятным, чтобы действительно ответить на этот вопрос ... Но чтобы ответить на вопрос технически, как отправить HTTP-запрос на a Tor SOCKS proxy на localhost, снова легко ..

<?php 
$ch = curl_init('http://google.com'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
curl_setopt($ch, CURLOPT_PROXY, 'https://127.0.01:9050/'); 
curl_exec($ch); 
curl_close($ch); 

Но что говорит нам Tor?

HTTP/1.0 501 Тор не является HTTP-прокси

Content-Type: Текст/HTML; кодировка = изо-8859-1

В основном, learn more о SOCKS & HTTP. Другим вариантом является Google для клиентов PHP SOCKS. Быстрый осмотр показывает a library, который утверждает, что может отправлять HTTP-запросы по SOCKS.

EDIT:

Хорошо, более 1 править!Через несколько секунд после окончания моего последнего сообщения я нашел способ сделать это. This article показывает нам, как настроить что-то под названием Privoxy, которое переводит запросы SOCKS в HTTP-запросы. Положите это на Tor и blamo, мы отправляем проксированные HTTP-запросы через Tor!

+0

Нет, это не работает для меня .... – user1203301

+2

Похоже, у вас есть чтение, чтобы сделать ... – quickshiftin

+1

ive прочитал эту статью сотни раз за прошедшую неделю. Это не работает - поверьте мне. – user1203301

-1

Просто сделать у вас есть HTTP прокси:

<?php 

/** 
* Proxy script that performs any HTTP request requested. 
*/ 

// Check key 
$key = 'YOUR_API_KEY'; 
if($_GET['key'] != $key) die; // Check for the API key 

// Check URL 
$url = isset($_GET['url']) ? trim(base64_decode($_GET['url'])) : ''; 
if(!$url || !filter_var($url, FILTER_VALIDATE_URL)) die; // Incorrect URL 

class MyCurl { 

    /** 
    * CURL resource link 
    * 
    * @var resource 
    */ 
    protected $resource; 

    /** 
    * Constructor 
    * 
    * @param String $host 
    * @return MyCurl 
    */ 
    public function __construct($url = 'localhost'){ 
     $this->resource = curl_init(); 
     $this->setUrl($url); 
     $this->setOptions(array(
//   CURLOPT_RETURNTRANSFER => TRUE, 
      CURLOPT_AUTOREFERER => TRUE, 
      CURLOPT_FOLLOWLOCATION => TRUE, 
      CURLOPT_REFERER => 'http://www.google.com/', 
      CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)', 
      CURLOPT_SSL_VERIFYHOST => FALSE, 
      CURLOPT_SSL_VERIFYPEER => FALSE, 
     )); 
    } 

    /** 
    * Set URL for the next request 
    * 
    * @param String $url 
    */ 
    public function setUrl($url = 'localhost') { 
     $this->setOption(CURLOPT_URL, $url); 
    } 

    /** 
    * Sets option to the CURL resource. 
    * See http://www.php.net/manual/en/function.curl-setopt.php for option description 
    * 
    * @param int $name Option identifier 
    * @param mixed $value Option value 
    * @return Crawler_Curl Returns itself for sugar-code 
    */ 
    public function & setOption($name, $value){ 
     curl_setopt($this->resource, $name, $value); 
     return $this; 
    } 

    /** 
    * Sets multiple CURL options at once 
    * 
    * @param array $options Associative array of options 
    * @return Crawler_Curl Returns itself for sugar-code 
    */ 
    public function & setOptions($options){ 
     curl_setopt_array($this->resource, $options); 
     return $this; 
    } 

    /** 
    * Set User-Agent header of the browser 
    * 
    * @param String $useragent Defaults to Mozilla browser 
    */ 
    public function setUserAgent($useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0') { 
     $this->setOption(CURLOPT_USERAGENT, $useragent); 
    } 

    /** 
    * Get curl request info 
    * 
    * @array 
    */ 
    public function info() { 
     return curl_getinfo($this->resource); 
    } 

    /** 
    * Return sent headers if CURLINFO_HEADER_OUT option was enabled 
    * 
    * @return String Headers 
    */ 
    public function headersSent() { 
     return curl_getinfo($this->resource, CURLINFO_HEADER_OUT); 
    } 

    /** 
    * Executes CURL request 
    * 
    * @return mixed Returns CURL execution result 
    */ 
    public function execute(){ 
     return curl_exec($this->resource); 
    } 

    /** 
    * Cleans CURL connection 
    */ 
    function __destruct(){ 
     curl_close($this->resource); 
    } 

} 

$curl = new MyCurl($url); 
$curl->execute(); 
+3

Это не отвечает на вопрос. –

+0

Мне действительно нравится это, потому что у некоторых может быть доступ ко многим местам, которые запускают php вместо того, чтобы иметь доступ к одному выделенному/VPS, где они могут установить privoxy. Если вы скажете десятки учетных записей хостинга с разными ips, вы можете настроить собственную небольшую прокси-сеть. – JaseC

2

вы должны перехватить запрос DNS поиск от сценария PHP путем настройки Tor с помощью директивы «dnsport». то вам нужно настроить «транспорт» для tor и «virtualnetworkaddress». теперь, когда ваш php-скрипт выполняет dns-lookup thru tor, он видит запрос на луковый адрес и отвечает с IP-адресом из диапазона «virtualnetworkaddress». вам теперь нужно перенаправить трафик, идущий по этому адресу, на адрес, определенный с помощью «транспорта». прочитайте руководство «torrc» на «automaphostonresolve», «virtualnetworkaddress», «dnsport» и «transport».

+1

Добавление примера было бы замечательным, поэтому все это для неопытного пользователя может быть сложнее, чем увидеть пример. – nKn

1

Я думаю, что это так же просто, как выполнить запрос командной строки с помощью опции usewithtor или torify. Например:

$ usewithtor crawl.php

И сценарий будет иметь возможность взаимодействовать с .onion сайтов. Создав искатель для самого Тора, я определенно не пошел бы по этому пути для использования в производстве, вместо этого вместо CURL я бы использовал python, PySocks и другие библиотеки искателей. Надеюсь, это ответит на ваш вопрос и даст вам несколько идей для продвижения других стратегий реализации.

Благодаря