php & socks 5

Тема в разделе "PHP", создана пользователем funman, 24 апр 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. funman

    funman Постоялец

    Регистр.:
    28 дек 2007
    Сообщения:
    146
    Симпатии:
    25
    Добрый день!

    Поделитесь примерчиком как средствами php можно использовать socks 5.

    можно ли socks 5 использовать в связки с cURL?
     
  2. Phentis

    Phentis Создатель

    Регистр.:
    23 авг 2008
    Сообщения:
    16
    Симпатии:
    0
    Сорри за оффтоп, но из-за этого дебильного ограничения на кол-во постов я не могу создать отдельную тему :(

    Как можно защитить сайт от входа через прокси? Хочу написать партнерку, где за переход по ссылке зачисляется копеечка. Проверка идет через IP. Но трабла в том, что накрутить это дело можно будет через прокси (и проги типа topgen). Как можно от них защититься?

    Заранее Спасибо!
     
  3. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Вот здесь можно взять php socks5 класс:
    http://www.phpclasses.org/browse/package/1822.htmlТам же можно скачать пример использования класса.

    Добавлено через 14 минут
    Вы можете анализировать переменные окружения:

    REMOTE_ADDR - IP адрес клиента
    HTTP_VIA - если не пустая, значит используется proxy. Значение - адрес (или несколько адресов) proxy сервера.
    HTTP_X_FORWARDED_FOR - если не пустая, значит используется proxy. Значение - реальный IP адрес клиента.

    Однако, через прокси может работать и "честный" посетитель. А "накрутчик" вообще может скрыть информацию о прокси. Если вы принимаете решение платить за клик, то для этого решения нужны веские основания, при этом задача выявления накрутчиков будет совсем не тривиальная.
     
  4. MisterX

    MisterX Постоялец

    Регистр.:
    10 ноя 2006
    Сообщения:
    101
    Симпатии:
    7
    Вот нашел код, которым я пользовался
    PHP:
    // отправка запроса, посл. 3 аргумента передаются по ссылке, результат - страничка без хидера
    function submit_request($req_url$proxy$req_POST, &$last_error, &$req_referer, &$cookie_ar)
    {
            
    $last_error '';
            
    $req_cookie "";        // подделка куки для данного хоста (д.б. urlencoded)
            
    if (!empty($cookie_ar)) {
                    foreach(
    $cookie_ar as $cki_name => $cki_value)
                            
    $req_cookie .= (empty($req_cookie)?"":"; ").$cki_name."=".$cki_value;
            }

            
    $ch curl_init();
            
    curl_setopt($chCURLOPT_URL$req_url);
            
    curl_setopt($chCURLOPT_TIMEOUT60);
            
    curl_setopt($chCURLOPT_SSL_VERIFYPEER0);
            
    curl_setopt($chCURLOPT_HEADER1);
            
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
            
    curl_setopt($chCURLOPT_REFERER$req_referer);
            if (
    $proxy)
               
    curl_setopt($chCURLOPT_PROXY$proxy);
            
    curl_setopt($chCURLOPT_PROXYTYPECURLPROXY_SOCKS5);
            if (
    $req_cookie)
                    
    curl_setopt($chCURLOPT_COOKIE$req_cookie);
            
    curl_setopt($chCURLOPT_FOLLOWLOCATION0);
            if (
    $req_POST) {
                    
    curl_setopt($chCURLOPT_POST1);
                    
    curl_setopt($chCURLOPT_POSTFIELDS$req_POST);
            }
            
    curl_setopt($chCURLOPT_HTTPHEADER, array("Accept-Language: en"));
            
    curl_setopt($chCURLOPT_RETURNTRANSFER1);

            
    $p_string curl_exec($ch);
            if(!
    $p_string) {
                    
    //$last_error = "<b>request ERROR: ".curl_error($ch)."</b><br>\r\n";
                    
    $last_error 'ServerError';
                    return 
    false;
            }
            
    curl_close($ch);
            
    /*
            // logging
            if (is_dir("inc/logs")) {
                    $f = @fopen("inc/logs/".date("Y-m-d_H-i-s").".htm", "w");
                    if($f) {
                            fwrite($f, "\$req_url=$req_url<br>\r\n\$req_POST=$req_POST<br>\r\n\$req_referer=$req_referer<br>\r\n".
                                               "\$req_cookie=$req_cookie<br>\r\n\r\n".$p_string);
                            fclose($f);
                    }
            }
            */
            // сохр. тек. реферера в переменной, передаваемой по ссылке, разделение хидера и контента
            
    $req_referer $req_url;
            
    $p_content $p_string;
            do {
                    list(
    $p_header$p_content) = preg_split('/\r\r|\n\n|\r\n\r\n/m'$p_content2);
                    if (empty(
    $p_header) || !preg_match("/^HTTP\/1\.[01] (\d{3})/ms"$p_header$sm)) {
                            
    $last_error "<b>data ERROR: No header found</b><br>\r\n";
                            return 
    false;
                    }
            } while(
    $sm[1] == 100);

            
    // сохранение полученных cookies с учётом expire date в static $cookie_ar
            
    if (preg_match_all('/^Set-Cookie:\s*(.*?);?\r?\n?$/msi'$p_header$ccm)) {
                    
    $cur_time time();
                    foreach(
    $ccm[1] as $cm) {
                            
    $prt explode(";"$cm);
                            
    $cki explode("="$prt[0], 2);
                            
    $cki_name trim($cki[0]);
                            
    $cki_value = (isset($cki[1])?$cki[1]:"");
                            
    $cki_expire 0;
                            if (!empty(
    $prt[1])) {
                                    list(
    $exp_n$exp_v) = explode("="$prt[1]);
                                    if (
    strtolower(trim($exp_n)) == "expires") {
                                            
    $cki_expire strtotime($exp_v);
                                    }
                            }
                            if (
    $cki_expire == || $cki_expire == -|| $cki_expire $cur_time// if not expired
                                    
    $cookie_ar[$cki_name] = $cki_value;
                            else {
                                    if (isset(
    $cookie_ar[$cki_name])) unset($cookie_ar[$cki_name]);
                            }
                    }
    //foreach mm[1]
            
    }//if for cookie

            
    if($sm[1] == 404) { //no found
              
    $last_error '404';
            }

            if(
    $sm[1] == 301 || $sm[1] == 302 || $sm[1] == 303 || $sm[1] == 307) { //redirect (301 Moved Permanently, 302 Found, 303 See Other, 307 Temporary Redirect
                    
    preg_match('/^Location:\s*(.*?)\r?\n?$/msi'$p_header$mm);
                    
    $rdr_adr pr_url($req_url$mm[1]);
                    
    $req_url $rdr_adr['scheme']."://".$rdr_adr['host'].$rdr_adr['query'];
                    return 
    submit_request($req_url$proxy""$last_error$req_referer$cookie_ar);
            }

            return 
    $p_content;
    }

    function 
    pr_url(&$this_adr$rel_adr null// parse this_adr and make it real (by link), if rel_adr - return real rel_adr parsing
    {                                                                                         // return false or array('host' => 'www.host.com', 'query' => '/folder/file?req=1&a=b')
            
    static $cache = array(); //cache this_adr parsing results
            
    if (!isset($cache[$this_adr])) {
                    
    $url parse_url($this_adr);        // parse url and make it real (http://url)
                    
    if (!empty($this_adr) && empty($url['scheme'])) {
                            
    $this_adr "http://".$this_adr//fix
                            
    $url parse_url($this_adr);
                    }
                    if (empty(
    $this_adr) || empty($url['host']) || ($url['scheme'] != "http" && $url['scheme'] != "https")) {
                            
    $this_adr "";
                            return 
    false;
                    }
                    
    $url['top_host'] = preg_replace('/.*?([\w\d-]+\.\w+)$/''$1'$url['host']);
                    
    $cache[$this_adr] = $url;
            } else {
                    
    $url $cache[$this_adr];
            }
            if (
    $rel_adr === null) {        // only parse url
                    
    return array("scheme" => $url['scheme'],
                                             
    "host"  => $url['host'],
                                             
    "query" => (!empty($url['path'])?$url['path']:"/") . (!empty($url['query'])?"?".$url['query']:""),
                                             
    "top_host" => $url['top_host']);
            }
            
    // else (rel_adr !== null) make rel url absolute
            
    $rel_adr str_replace("&amp;""&"$rel_adr);
            
    $rel parse_url($rel_adr);
            if (!empty(
    $rel['scheme'])) { //is absolute
                    
    if ($rel['scheme'] != "http" && $rel['scheme'] != "https") return false;
                    return array(
    "scheme" => $rel['scheme'],
                                             
    "host"  => $rel['host'],
                                             
    "query" => (!empty($rel['path'])?$rel['path']:"/") . (!empty($rel['query'])?"?".$rel['query']:""),
                                             
    "top_host" => preg_replace('/.*?([\w\d-]+\.\w+)$/''$1'$rel['host']));
            } elseif (empty(
    $rel['path'])) { // '?req'
                    
    return array("scheme" => $url['scheme'],
                                             
    "host"  => $url['host'],
                                             
    "query" => (!empty($url['path'])?$url['path']:"/") . (!empty($rel['query'])?"?".$rel['query']:""),
                                             
    "top_host" => $url['top_host']);
            } else { 
    // is relative
                    
    $parts explode("/"$rel['path']);
                    if (!empty(
    $url['path']) && $url['path'] != "/" && $rel['path'][0] != "/")
                            
    $parts array_merge(array_slice(explode("/"$url['path']), 1, -1), $parts);
                    
    $res "";
                    for(
    $i count($parts)-1$i >= 0$i--) { //from end
                            
    if ($parts[$i] == ".."$i--; //do not poccess next element
                            
    elseif ($parts[$i] != "." && $parts[$i] != ""$res "/".$parts[$i].$res;
                    }
                    return array(
    "scheme" => $url['scheme'],
                                             
    "host"  => $url['host'],
                                             
    "query" => $res . (($rel['path'][strlen($rel['path'])-1] == "/")?"/":"") . (!empty($rel['query'])?"?".$rel['query']:""),
                                             
    "top_host" => $url['top_host']);
            }

    }
     
  5. funman

    funman Постоялец

    Регистр.:
    28 дек 2007
    Сообщения:
    146
    Симпатии:
    25
    Всем спасибо, но мне в код хватило добавить
    PHP:
    curl_setopt($chCURLOPT_PROXYTYPECURLPROXY_SOCKS5);
    а дальше как через обычную проксю.

    Добавлено через 5 минут
    От Socks или NON-Transperent не как !
    если прокси не палит HTTP_X_FORWARDED , то думаю оч проблематично ...
    Но существуют способы которые помогают избавиться от накрутки (но не на 100%) Сессии, Кукисы, я думаю можно еще многое придумать чтобы избавиться от ботов...
     
  6. Atec

    Atec

    Регистр.:
    28 апр 2007
    Сообщения:
    296
    Симпатии:
    31
    Вопрос очень сложный чтобы сделать подобный скрипт нужно быть очень хорошим спецом... но я видел пару красивых реализаций, лучше всего анализировать информацию полученную по каждому партнеру на частоту кликов, на дальнейшие переходы, и т.п. действия и выводить отчеты - где будет понятно что например если у вас за полчаса 500 переходов на одну и туже стрницу и далее посетитель не идет - то это накрутка... кстати а как вы будете бороться с серфингом :) ведь там за 5$ можно и 1000 людей привести сразу :) я так на greenpik.ru в свое время более 20круб срубил... потом спалил тему на денгифоруме и все... :(
     
  7. x00xer

    x00xer Создатель

    Регистр.:
    30 мар 2009
    Сообщения:
    29
    Симпатии:
    2
    Если Прокси не отдает реального IP того кто лезет то простым способом никак.
     
  8. q2dm1

    q2dm1 Постоялец

    Регистр.:
    4 авг 2008
    Сообщения:
    65
    Симпатии:
    18
    практически никак, если только ставить условие что должно быть 2 захода с одного IP с разницей хотя бы 7 дней, но тебе такой вариант может не подойти.
     
Статус темы:
Закрыта.