Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   скрипт на PHP (http://forum.oszone.net/showthread.php?t=96220)

P O M A 16-12-2007 16:11 698187

скрипт на PHP
 
Помогите написать скрипт!(сам в PHP почти никак)
Он должен 3 раза посылать запрос на ссылку, дожидаться загрузки страницы, 1 раз на вторую, потом опять на первую...Запросы скрипта должны выглядеть как у обычного браузера, выполняться на сервере

Coutty 16-12-2007 17:08 698200

Так помогите или напишите?)

Цитата:

Цитата P O M A
1 раз на вторую, потом опять на первую... »

Чего?

PHP код:

<?php
// сначала составляем HTTP-запрос
$head 'GET /script.php?parameter=nya HTTP/1.1
User-Agent: Opera/9.20 (Windows NT 5.1; U; ru)
Host: www.oszone.net
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://www.oszone.net /* а может и с двумя r пишется - referrer. Хз. */
Cookie: remixchk=2; /*в общем, тут куки перечислить, если надо*/
'
// конец запроса 

$fp fsockopen ("www.oszone.net"80$errno$errstr30); // открываем сокет
if (!$fp) {
    echo 
"$errstr ($errno)<br>\n"// если не открыл - плохо
} else { // если открыл
    
fputs ($fp$head); // отправляем запрос
    
while (!feof($fp)) { // и получаем ответ
        
echo fgets ($fp,1280000);
    }
    
fclose ($fp); // ответ получили, сокет закрываем.
}

// и продолжаем делать то, что надо.

GET-запрос (аналогично и с POST) можно словить через анализатор трафика (он же сниффер). Например, wireshark. И всё вписать в $head.

Arrest 16-12-2007 18:52 698239

Для случая P O M A, наверное, нужно так:
PHP код:

<?php
//Запрос к первой странице
$q1 "GET /page1 HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: www.ru\r\n\r\n";

for(
$i=0$i<3$i++){
    
$fp fsockopen ("http://www.ru"80$errno$errstr30); // открываем сокет 
    
if (!$fp) { 
        echo 
"$errstr ($errno)<br>\n"// если не открыл - плохо 
    
} else { // если открыл 
        
fputs ($fp$q1); // отправляем запрос 
        
while (!feof($fp)) { // и получаем ответ 
            
echo fgets ($fp,1280000); 
        } 
     
fclose ($fp); // ответ получили, сокет закрываем. 
     
unset($fp);


$q2 "GET /page2 HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: www.ru\r\n\r\n";

$fp fsockopen ("http://www.ru"80$errno$errstr30); // открываем сокет 
    
if (!$fp) { 
        echo 
"$errstr ($errno)<br>\n"// если не открыл - плохо 
    
} else { // если открыл 
        
fputs ($fp$q2); // отправляем запрос 
        
while (!feof($fp)) { // и получаем ответ 
            
echo fgets ($fp,1280000); 
        } 
     
fclose ($fp); // ответ получили, сокет закрываем. 
}

$fp fsockopen ("http://www.ru"80$errno$errstr30); // открываем сокет 
if (!$fp) { 
    echo 
"$errstr ($errno)<br>\n";
} else { 
// если открыл 
    
fputs ($fp$q1); // отправляем запрос 
    
while (!feof($fp)) { // и получаем ответ 
        
echo fgets ($fp,1280000); 
   } 
fclose ($fp);
unset(
$fp);

Скрипт переделан из Coutty'евского :)

P O M A 16-12-2007 18:53 698240

ну это типа накрутчика

Arrest 16-12-2007 19:03 698243

счетчики надо накручивать по другому. надо запрашивать их картинку, а не всю страницу.

Coutty 16-12-2007 19:09 698247

Накрутка будет обнаружена, если запрашивать с одного IP-адреса.

P O M A 16-12-2007 19:31 698251

не, это не накрутчик счётчиков и по IP не вычислят.Arrest, этот скрипт такой, какой мне надо? И как я понял, вместо http://ww.ru нухно писать свой URL? Как эту накрутку можно будет остановить?

P O M A 16-12-2007 20:17 698266

а вот ещё вопросы: после host нужно писать сайт, где лежит скрипт или сайт-жертву? В 3ем открытии сокета какую ссылку нужно писать(page1,page или чтото другое)?

Coutty 16-12-2007 21:09 698290

Цитата:

Цитата P O M A
ак эту накрутку можно будет остановить? »

Скрипт сам остановится через max_execution_time, установленное в httpd.conf. Обычно это 30 секунд.
Даже если он не успеет сделать ни одного запроса))
Но тут только 5 запросов в скрипте. Если нужен цикл - нужно его ещё сделать.
Вообще, должен быть ещё спецплагин к php, позволяющий работать с сокетами. Проверь, будет ли вообще работать.
Цитата:

Цитата P O M A
после host нужно писать сайт, где лежит скрипт или сайт-жертву? »

Туда будет отправляться запрос. Вообще, я не совсем понимаю, зачем это писать, если всё равно на тот сайт отправляешь.
Цитата:

Цитата P O M A
вместо http://ww.ru нухно писать свой URL »

Вместо него надо писать адрес, на который отправляешь запрос.

Arrest 16-12-2007 23:19 698363

Coutty,
Цитата:

Цитата Coutty
ачем это писать, если всё равно на тот сайт отправляешь. »

RFC 2616, секция 14.23:
Цитата:

A client MUST include a Host header field in all HTTP/1.1 request messages.
...
All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request) status code to any HTTP/1.1 request message which lacks a Host header field.
То бишь с HTTP 1.1 заголовок Host необходим, и на запросы без него сервак будет матюгаться 400-ой ошибкой.
P O M A
Ага. Это тот скрипт.
Да. Надо менять.

P O M A 19-12-2007 17:58 700068

а если такой скрипт:
1. GET к page1
2.GET к PAGE1
3.GET к PAGE1
(или page1 циклом)
4.GET к Page2
5. Перезагрузка скрипта?
А на каком хостинге можно будет разместить этот скрипт? А то разместил на народе, браузеры его просто открывают

Coutty 19-12-2007 20:46 700139

P O M A, ищи хостинг с поддержкой php. Например, holm.ru.
Может быть ещё ucoz.ru. Только я не знаю - можно ли там свои скрипты выкладывать.

Цитата:

Цитата P O M A
5. Перезагрузка скрипта? »

Можно попробовать в этом пункте сделать вызов самого скрипта и убить текущее выполнение.
Что-то вроде "GET script.php"; exit();
Т.е. он вызовет выполнение себя ещё раз, а отработанный завершится.
Или, если время исполнения где-нибудь будет не ограничено, то всё в цикл поместить.

P O M A 20-12-2007 18:15 700767

а так будет работать
PHP код:

<?php 
//Запрос к первой странице 
$q1 "GET /page1 HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: www.адрес_сайта.ru\r\n\r\n"

for(
$i=0$i<3$i++){ 
    
$fp fsockopen ("http://www.ссылка1.ru"80$errno$errstr30); // открываем сокет  
    
if (!$fp) {  
        echo 
"$errstr ($errno)<br>\n"// если не открыл - плохо  
    
} else { // если открыл  
        
fputs ($fp$q1); // отправляем запрос  
        
while (!feof($fp)) { // и получаем ответ  
            
echo fgets ($fp,1280000);  
        }  
     
fclose ($fp); // ответ получили, сокет закрываем.  
     
unset($fp); 
}  

$q2 "GET /page2 HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: www.адрес_сайта.ru\r\n\r\n"

$fp fsockopen ("http://www.ссылка2.ru"80$errno$errstr30); // открываем сокет  
    
if (!$fp) {  
        echo 
"$errstr ($errno)<br>\n"// если не открыл - плохо  
    
} else { // если открыл  
        
fputs ($fp$q2); // отправляем запрос  
        
while (!feof($fp)) { // и получаем ответ  
            
echo fgets ($fp,1280000);  
        }  
     
fclose ($fp); // ответ получили, сокет закрываем.  

 
$q1 "GET /page3 HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: www.адрес_сайта.ru\r\n\r\n"

for(
$i=0$i<3$i++){ 
    
$fp fsockopen ("http://www.ссылка3.ru"80$errno$errstr30); // открываем сокет  
    
if (!$fp) {  
        echo 
"$errstr ($errno)<br>\n"// если не открыл - плохо  
    
} else { // если открыл  
        
fputs ($fp$q1); // отправляем запрос  
        
while (!feof($fp)) { // и получаем ответ  
            
echo fgets ($fp,1280000);  
        }  
     
fclose ($fp); // ответ получили, сокет закрываем.  
     
unset($fp); 
}  

$q2 "GET /page4 HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: www.адрес_сайта.ru\r\n\r\n"

$fp fsockopen ("http://www.ссылка4.ru"80$errno$errstr30); // открываем сокет  
    
if (!$fp) {  
        echo 
"$errstr ($errno)<br>\n"// если не открыл - плохо  
    
} else { // если открыл  
        
fputs ($fp$q2); // отправляем запрос  
        
while (!feof($fp)) { // и получаем ответ  
            
echo fgets ($fp,1280000);  
        }  
     
fclose ($fp); // ответ получили, сокет закрываем.  
}
"GET script.php"; exit();


Coutty 20-12-2007 22:32 700892

Нет, конечно))
"GET script.php"; exit(); - я имел в виду так (в конце):
PHP код:

$q2 "GET script.php HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: www.свой_сайт.ru\r\n\r\n";  

$fp fsockopen ("http://www.свой_сайт.ru"80$errno$errstr30); // открываем сокет   
    
if (!$fp) {   
        echo 
"$errstr ($errno)<br>\n"// если не открыл - плохо   
    
} else { // если открыл   
        
fputs ($fp$q2); // отправляем запрос   
        
while (!feof($fp)) { // и получаем ответ   
            
echo fgets ($fp,1280000);   
        }   
     
fclose ($fp); // ответ получили, сокет закрываем. 
}
exit(); 


P O M A 21-12-2007 15:36 701287

хорошо, вот только я не понял - после GET нужно писать полную сыылку(http://sayt.ru/...\...\) или как? А при открытии сокета - только сам сайт?

Coutty 21-12-2007 18:02 701367

После GET надо писать имя скрипта с GET-параметрами (которые после вопроса стоят). При открытии сокета - имя хоста.

Arrest 22-12-2007 18:02 701887

черт, хорошая идея делать GET до конца выполнения скрипта, надо взять на вооружение :)

P O M A 03-01-2008 10:46 708023

вот кое-что поделал:
PHP код:

<?php  
 
$q1 
"GET /...../скрипт.пхп HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: сайт1.ру\r\n\r\n";  

for(
$i=0$i<3$i++){  
    
$fp fsockopen ("http://сайт1.ру"80$errno$errstr30);   
    if (!
$fp) {   
        echo 
"$errstr ($errno)<br>\n"
    } else {  
        
fputs ($fp$q1); 
        while (!
feof($fp)) {    
            echo 
fgets ($fp,1280000);   
        }   
     
fclose ($fp);   
     unset(
$fp);  
}   

$q2 "GET /...../скрипт.пхп HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: сайт1.ру\r\n\r\n";  

$fp fsockopen ("http://сайт1.ру"80$errno$errstr30); 
    if (!
$fp) {   
        echo 
"$errstr ($errno)<br>\n"
    } else { 
        
fputs ($fp$q2); 
        while (!
feof($fp)) {
            echo 
fgets ($fp,1280000);   
        }   
     
fclose ($fp);
}  
  
$q3 "GET /...../скрипт.пхп HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: сайт1.ру\r\n\r\n";  

for(
$i=0$i<3$i++){  
    
$fp fsockopen ("http://сайт1.ру"80$errno$errstr30);  
    if (!
$fp) {   
        echo 
"$errstr ($errno)<br>\n";
    } else {
        
fputs ($fp$q1);
        while (!
feof($fp)) {
            echo 
fgets ($fp,1280000);   
        }   
     
fclose ($fp);
     unset(
$fp);  
}   

$q4 "GET /...../скрипт2.пхп HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: сайт1.ру\r\n\r\n";  

$fp fsockopen ("http://сайт1.ру.ru"80$errno$errstr30);
    if (!
$fp) {   
        echo 
"$errstr ($errno)<br>\n";
    } else {
        
fputs ($fp$q2);
        while (!
feof($fp)) {
            echo 
fgets ($fp,1280000);   
        }   
     
fclose ($fp);
}

$q5 "GET script.php HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Linux i686)\r\nHost: сайт2.ру\r\n\r\n";   

$fp fsockopen ("http://сайт2.ру"80$errno$errstr30);
    if (!
$fp) {    
        echo 
"$errstr ($errno)<br>\n";
    } else {
        
fputs ($fp$q2); 
        while (!
feof($fp)) {
            echo 
fgets ($fp,1280000);    
        }    
     
fclose ($fp);

exit();

сайт1.ру - "сайт-жертва"
/..../скрипт1.пхп - "скрипт-жертва"
сайт2.ру - сайт, где лежит мой скрипт
Script.php - мой скрипт
Так работать будет?

vadimiron 03-01-2008 11:35 708042

Цитата:

Цитата P O M A
Так работать будет? »

Вот я удивляюсь - а почему бы просто не протестировать. Так Вы сами поймёте работает или нет, а если нет - то сразу увидите ошибки...

P O M A 04-01-2008 18:14 708878

Что обозначает вот это?:
Parse error: parse error, unexpected $ in /home/a/.../www/script.php on line 71
Всё ли правильно я сделал?

Coutty 04-01-2008 19:11 708934

P O M A, скорее всего это означает, что в предыдущей строке забыл поставить в конце точку с запятой. Либо в этой строке поставил лишний знак переменной.

vadimiron 04-01-2008 20:14 708985

P O M A,
В таких случаях показывайте данную строчку и пару строчек вокруг - тогда вам быстрей помогут. Откуда мы знаем, что у вас там стоит

P O M A 05-01-2008 12:56 709401

Цитата:

Цитата vadimiron
В таких случаях показывайте данную строчку и пару строчек вокруг »

PHP код:

} else { 
        
fputs ($fp$q2);  
71строка        while (!feof($fp)) { 
            echo 
fgets ($fp,1280000);     
        }     
     
fclose ($fp); 


Coutty 05-01-2008 16:39 709513

Я не вижу, в чём может быть проблема. Может быть стоит указать unset($fp); после каждого fclose($fp);

Имеется в виду скрипт из 18 сообщения?

P O M A 05-01-2008 17:31 709554

Цитата:

Цитата Coutty
Имеется в виду скрипт из 18 сообщения? »

именно этот, переделан из скрипта Arrest"а. Вообще я его правильно переделал?

P O M A 07-01-2008 15:31 711101

что означает ошибка 500 (CGI приложение доступно на запись другим пользователям. Для выполнения оно должно иметь права 0755 или 0711.) и как с ней бороться?

Coutty 07-01-2008 15:58 711126

Цитата:

Цитата P O M A
что означает ошибка 500 (CGI приложение доступно на запись другим пользователям. Для выполнения оно должно иметь права 0755 или 0711.) и как с ней бороться? »

Видимо, сейчас стоит 0777=) Подключись через SSH к серверу, да в терминале выполни chmod 755 скрипт.php (хотя странно, что оно по умолчанию не поставило 755.


Время: 16:06.

Время: 16:06.
© OSzone.net 2001-