http. вопрос по пртоколу.

Discussion in 'PHP' started by x-treem, 21 May 2007.

  1. x-treem

    x-treem Elder - Старейшина

    Joined:
    8 Nov 2006
    Messages:
    130
    Likes Received:
    16
    Reputations:
    0
    долго искал, но так и нечего не нашёл. скажите, каким должен быть пакет серверу, что бы можно было закачать фаил.
    то есть есть к примеру во всех шеллах опция "залить файл", и вот интересно было бы узнать, как же передаются эти данные.
     
  2. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Вот в сорцах шелла посмотри =\
     
  3. x-treem

    x-treem Elder - Старейшина

    Joined:
    8 Nov 2006
    Messages:
    130
    Likes Received:
    16
    Reputations:
    0
    млин, ты не понял... надо сам ПАКЕТ протокола хттп. то есть его описание, а не просто код позволяющий закачивать файл=\
     
  4. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    PHP:
    <?
    ///////////////////////
    //$site адрес сайта вида www.google.com
    //$mesto где лежит на сайте типа soft/fucking/1.rar
    /////Coded by mr.The///
    error_reporting (E_ALL);
    set_time_limit(0);

    if(!isset(
    $_GET['site'])) {
    echo 
    "Ошибко!";
    exit;
    } else {
    $site=$_GET['site'];
    };
    if(!isset(
    $_GET['mesto'])) {
    echo 
    "Ошибко!";
    exit;
    } else {
    $mesto=$_GET['mesto'];
    };

       
    // открыли соединение
       
    $so fsockopen($site80, &$errno, &$errstr30);
       
    // послали GET форму (простой URL + указание вирт. хоста)
       
    fputs($so,"GET /".$mesto." HTTP/1.0\nHOST: ".$site."\n\n");

       
    // читаем все, пока не наступит "конец заголовка" (т.е. начало документа)
       // если наступит, то со след. байта начнется документ
       
    while(fgets($so,2048)!="\r\n" && !feof($so));

       unset(
    $buf);
       
    // читаем документ в переменную
       
    while(!feof($so)) $buf.=fread($so,2048);
       
    // Готово. В переменной $buf храниться скаченный документ (т.е. файл)
       // Максимум можно читать порциями по 64K-1байт

       // закрываем сокет
       
    $name=strrev(md5($mesto.$site)).".file";
       
    fclose($so);
       
    // используем скаченный файл (в переменной) по назначению...
       
    $f=fopen($name,"wb+");
       
    fwrite($f,$buf,strlen($buf));
       
    fclose($f);
       
    flush();
       echo 
    "Файл размером ".strlen($buf)." байт успешно закачан.<br>";
    ?>
    вот примерно так.
    коментариев мало. так шо спрашивай
     
    2 people like this.
  5. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,547
    Likes Received:
    1,398
    Reputations:
    612
    а документацию слабо почитать? или в крайний случай перехватит и посмотреть его.. мда..
     
  6. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,547
    Likes Received:
    1,398
    Reputations:
    612
    что за маразм ставить копирайты на 3 строки кода?..
     
  7. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Мда....если тут мало комментариев, то мда =\
    У тебя весь код засран в комментариях...надо было разобрались бы....
    А так код то в 10 строках
     
  8. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Буагага
    PHP:
    if(!isset($_GET['site'])) {
    echo 
    "Ошибко!";
    exit;
    } else {
    $site=$_GET['site'];
    };
    if(!isset(
    $_GET['mesto'])) {
    echo 
    "Ошибко!";
    exit;
    } else {
    $mesto=$_GET['mesto'];
    }; 
    Это что?)))))))))))
    Вам прям нежалко точек с запятой.....
    И вы затрахали с такими некрасивыми кодами =\
    Код весь должен находиться от левой границы на расстоянии/t => Tab ...
    И знаки равно красивее было бы отделать от переменыых пробелами....
    Код от этого скорость не изменит , но станет намного понятен и красивее
     
  9. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    тебе не всё равно?
    я видел когда после каждой строчки.
    знаю.... просто мне когдато этот скрипт срочно нужен был. поэтому на красивости времени небыло
     
  10. _Nikolas_

    _Nikolas_ New Member

    Joined:
    27 Dec 2006
    Messages:
    17
    Likes Received:
    3
    Reputations:
    0
    Насколько я знаю это делается через multipart/form-data.
    Вот ссылки по теме:
    http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2
    http://www.15seconds.com/issue/001003.htm
    http://www.cs.tut.fi/~jkorpela/forms/file.html
     
    1 person likes this.
  11. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    1. Протокол HTTP. Введение

    Сразу хочу уточнить одну маленькую вещь. Страшное слово протокол есть не что иное, как соглашение множества людей, просто в один прекрасный момент люди решили: "Давайте будем делать так, и тогда все будет в порядке". Бояться нечего, все просто до безобразия и это безобразие мы сейчас будем вскрывать. Итак, что же это такое протокол HTTP и с чем его едят?
    1.1 Клиент и сервер

    Чудес в мире, а тем более в мире программизма и интернета не бывает! Усвойте это как незыблемую истину. И, если программа не работает или работает не так как хочется, то, значит, скорее всего, она либо написана не правильно, либо содержит ошибки. Итак, как же все-таки браузер просит сервер прислать ему хоть что-нибудь? Да очень просто! Надо только немного расслабиться и начать получать удовольствие от процесса :)
    1.2. Пишем наш первый HTTP запрос

    Если Вы думаете, что все слишком сложно, то Вы ошибаетесь. Человек так устроен, что просто не способен создавать что-то сложное, иначе он сам в этом запутается :) Итак, есть браузер и есть Web-сервер. Инициатором обмена данными всегда выступает браузер. Web-сервер никому, никогда просто так ничего не пошлет, чтобы он что-нибудь отправил браузеру — надо, чтобы браузер об этом попросил. Простейший HTTP запрос моет выглядеть, например, так:

    GET http://www.php.net/ HTTP/1.0\r\n\r\n

    * GET (В переводе с английского означает "получить") — тип запроса, тип запроса может быть разным, например POST, HEAD, PUT, DELETE (часть из них мы рассмотрим ниже).
    * http://www.php.net/ — URI (адрес) от которого мы хотим получить хоть какую-нибудь информацию (естественно мы надеемся подучить HTML страницу).
    * HTTP/1.0 — тип и версия протокола, который мы будем использовать в процессе общения с сервером.
    * \r\n — конец строки, который необходимо повторить два раза, зачем, станет понятно немного позднее.

    Вы можете выполнить данный запрос очень просто. Запустите программу telnet.exe, введите в качестве хоста www.php.net, укажите порт 80, и просто наберите данный запрос, нажав два раза Enter в качестве \r\n\r\n. В ответ вы получите HTML код главной страницы сайта www.php.net.

    1.3 Структура запроса

    Рассмотрим, из чего состоит HTTP запрос. Все достаточно просто. Начнем с того, что HTTP запрос — это вполне осмысленный текст. Из чего же он состоит в общем случае? Будем рассматривать протокол HTTP 1.0. Итак:

    Request-Line [ General-Header | Request-Header | Entity-Header ]\r\n[ Entity-Body ]

    * Request-Line — строка запроса
    *

    Формат: "Method Request-URI HTTP-Version\r\n"
    * Method — метод, которым будет обрабатываться ресурс Request-URI, может быть GET, POST, PUT, DELETE или HEAD.
    * Request-URI — относительная или абсолютная ссылка на страницу с набором параметров, например, /index.html или http://www.myhost.ru/index.html или /index.html?a=1&b=qq. В последнем случае серверу будет передан запрос с набором переменных a и b с соответствующими значениями, а знак "&" — амперсант служит разделителем между параметрами.
    * HTTP-Version — версия HTTP протокола, в нашем случае "HTTP/1.0".

    Нам крайне интересны методы обработки GET и POST. Методом GET можно просто передать параметры в скрипт, а методом POST можно эмулировать submit формы.

    Для метода GET, Request-URI может выглядеть, например, так: "/index.html?param1=1&param2=2".

    * General-Header — главная часть заголовка.
    Формат: [Date: value\n | Pragma: no-cache\n]
    Может иметь только два параметра: Date или Pragma. Date — дата по Гринвичу в формате "День недели, Число Месяц Год ЧЧ:ММ:СС GMT", например, "Tue, 15 Nov 1994 08:12:31 GMT" — дата создания запроса. Pragma может иметь одно значение no-cache, которое запрещает кэширование страницы.

    * Request-Header — часть заголовка, описывающая запрос.

    Request-Header может иметь следующие параметры: Allow, Authorization, From, If-Modified-Since, Referer, User-Agent.
    В данной главе мы не будем рассматривать параметр Autorization, так как он используется для доступа к закрытым ресурсам, что требуется не так уж часто. Вы можете самостоятельно изучить формирование заголовка для авторизованного доступа на сайте www.w3c.org.

    * Allow — задает допустимые методы обработки.
    Формат: "Allow: GET | HEAD\n".
    Параметр игнорируется при указании метода обработки POST в Request-Line. Задает допустимые методы обработки запроса. Прокси сервера не модифицируют параметр Allow и он в неизменном виде доходит до сервера.

    * From — e-mail адрес, пославшего запрос.
    Формат: "From: adderss\r\n".
    Например, "From: [email protected]\r\n".

    * If-Modified-Since — указывает, что запрос не модифицировался с такого-то времени.
    Формат: "If-Modified-Since: date\r\n"
    Используется только для метода обработки GET. Дата указывается по Гринвичу в таком же формате, как и для параметра Date в General-Header.

    * Referrer — абсолютная ссылка на страницу, с которой произошла инициация запроса, т. е. ссылка на страницу, с которой пользователь перешел на нашу.
    Формат: "Referrer: url\n".
    Пример: "Referrer: www.host.ru/index.html\n".
    * User-Agent — тип браузера.
    Например: "User-Agent: Mozilla/4.0\n"

    * Entity-Header — часть заголовка, описывающая данные Entity-Body.
    В данной части запроса задаются параметры, которые описывают тело страницы. Entity-Header может содержать следующие параметры: Allow, Content-Encoding, Content-Length, Content-Type, Expires, Last-Modified, extension-header.

    * Allow — параметр аналогичный Allow из General-Header.

    * Content-Encoding — тип кодирования данных Entity-Body.
    Формат: "Сontent-Encoding: x-gzip | x-compress | другой тип\n".
    Пример: "Сontent-Encoding: x-gzip\n". Символ "|" означает слово "или", то есть то или то или то и.т.д.
    Другой тип может указывать на способ кодирования данных, например, для метода POST: "Сontent-Encoding: application/x-www-form-urlencoded\n".

    * Content-Length — количество байт, пересылаемых в Entity-Body. Значение Content-Length имеет совсем другой смысл для данных, пересылаемых в формате MIME, где он выступает как параметр описания части данных — "external/entity-body". Допустимыми являются целые числа от нуля и больше.
    Пример: "Content-Length: 26457\n".

    * Content-Type — тип передаваемых данных.
    Например: "Content-Type: text/html\n".

    * Expires — Время, когда страница должна быть удалена из кэша браузера.
    Формат: "Expires: date\n". Формат даты алогичен формату даты для параметра Date из General-Header.

    * Last-Modified — время последнего изменения пересылаемых данных.
    Формат: "Last-Modified: date\n". Формат даты алогичен формату даты для параметра Date из General-Header.

    * Extention-header — часть заголовка, которая может предназначаться, например, для обработки браузером, или другой программой, которая принимает документ. В данной части можно описывать свои параметры в формате "ParameterName: parametervalue\n". Данные параметры будут игнорироваться, если программа-клиент не знает, как их обработать.
    Например: "Cookie: r=1\r\n" — устанавливает всем известные печеньки для страницы.

    А теперь после таких страшных слов давайте попробуем немного успокоиться и понять, что же нам надо? Понимать мы естественно будем на примерах.

    Давайте представим, что нам надо получить страницу с сайта, передав Cookies (Печеньки), иначе нас просто пошлют как незванных гостей, и более того, известно, что на данную страницу пускают только после того, как Вы побывали на главной странице сайта.
    2 Метод GET

    Напишем наш запрос.

    GET http://www.site.ru/news.html HTTP/1.0\r\n
    Host: www.site.ru\r\n
    Referer: http://www.site.ru/index.html\r\n
    Cookie: income=1\r\n
    \r\n

    Данный запрос говорит нам о том, что мы хотим получить содержимое страницы по адресу http://www.site.ru/news.html, использую метод GET. Поле Host говорит о том, что данная страница находится на сервере www.site.ru, поле Referer говорит о том, что за новостями мы пришли с главной страницы сайта, а поле Cookie говорит о том, что нам была присвоена такая-то кука. Почему так важны поля Host, Referer и Сookie? Потому что нормальные программисты при создании динамических сайтов проверяют данные поля, которые появляются в скриптах (РНР в том числе) в виде переменных. Для чего это надо? Для того, например, чтобы сайт не грабили, т.е. не натравливали на него программу для автоматического скачивания, или для того, чтобы зашедший на сайт человек всегда попадал бы на него только с главной страницы и.т.д.

    Теперь давайте представим, что нам надо заполнить поля формы на странице и отправить запрос из формы, пусть в данной форме будет два поля: login и password (логин и пароль),- и, мы естественно знаем логин и пароль.

    GET http://www.site.ru/news.html?login=Petya%20Vasechkin&password=qq HTTP/1.0\r\n
    Host: www.site.ru\r\n
    Referer: http://www.site.ru/index.html\r\n
    Cookie: income=1\r\n
    \r\n

    Логин у нас "Petya Vasechkin" Почему же мы должны писать Petya%20Vasechkin? Это из=за того, что специальные символы могут быть распознаны сервером, как признаки наличия нового параметра или конца запроса и.т.д. Поэтому существует алгоритм кодирования имен параметров и их значений, во избежание оштбочных ситуаций в запросе. Полное описание данного алгоритма можно найти здесь, а в PHP есть функции rawurlencode и rawurldecode для кодирования и декодирования соответственно. Хочу отметеить, что декодирование РНР делает сам, если в запросе были переданы закодированные параметры. На этом я закону первую главу знакомства c протоколом HTTP. В следуючей главе мы рассмотрим построение запросов типа POST (в переводе с английского — "отправить"), что будет гораздо интереснее, т.к. именно данный тип запросов используется при отправке данных из HTML форм.
    3. Метод POST.

    В случае HTTP запроса типа POST существует два варианта передачи полей из HTML форм, а именно, используя алгоритм application/x-www-form-urlencoded и multipart/form-data. Различия между данными алгоритмами весьма существенные. Дело в том, что алгоритм первого типа создавался давным-давно, когда в языке HTML еще не предусматривали возможность передачи файлов через HTML формы. Итак, давайте рассмотрим эти алгоритмы на примерах.
    3.1 Content-Type: application/x-www-form-urlencoded.

    Пишем запрос, аналогичный нашему запросу GET для передачи логина и пароля, который был рассмотрен в предыдущей главе:

    POST http://www.site.ru/news.html HTTP/1.0\r\n
    Host: www.site.ru\r\n
    Referer: http://www.site.ru/index.html\r\n
    Cookie: income=1\r\n
    Content-Type: application/x-www-form-urlencoded\r\n
    Content-Length: 35\r\n
    \r\n
    login=Petya%20Vasechkin&password=qq

    Здесь мы видим пример использования Content-Type и Content-Length полей заголовка. Content-Length говорит, сколько байт будет занимать область данных, которая отделяется от заголовка еще одним переводом строки \r\n. А вот параметры, которые раньше для запроса GET помещались в Request-URI, теперь находятся в Entity-Body. Видно, что они формируются точно также, просто надо написать их после заголовка. Хочу отметить еще один важный момент, ничто не мешает, одновременно с набором параметров в Entity-Body, помещать параметры с другими именами в Request-URI, например:

    POST http://www.site.ru/news.html?type=user HTTP/1.0\r\n
    .....
    \r\n
    login=Petya%20Vasechkin&password=qq

    3.2 Content-Type: multipart/form-data

    Как только интернет мир понял, что неплохо бы было через формы отсылать еще и файлы, так W3C консорциум взялся за доработку формата POST запроса. К тому времени уже достаточно широко применялся формат MIME (Multipurpose Internet Mail Extensions — многоцелевые расширения протокола для формирования Mail сообщений), поэтому, чтобы не изобретать велосипед заново, решили использовать часть данного формата формирования сообщений для создания POST запросов в протоколе HTTP.

    Каковы же основные отличия этого формата от типа application/x-www-form-urlencoded?

    Главное отличие в том, что Entity-Body теперь можно поделить на разделы, которые разделяются границами (boundary). Что самое интересное — каждый раздел может иметь свой собственный заголовок для описания данных, которые в нем хранятся, т.е. в одном запросе можно передавать данные различных типов (как в Mail письме Вы одновременно с текстом можете передавать файлы).

    Итак, приступим. Рассмотрим опять все тот же пример с передачей логина и пароля, но теперь в новом формате.

    POST http://www.site.ru/news.html HTTP/1.0\r\n
    Host: www.site.ru\r\n
    Referer: http://www.site.ru/index.html\r\n
    Cookie: income=1\r\n
    Content-Type: multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n
    Content-Length: 209\r\n
    \r\n
    --1BEF0A57BE110FD467A\r\n
    Content-Disposition: form-data; name="login"\r\n
    \r\n
    Petya Vasechkin\r\n
    --1BEF0A57BE110FD467A\r\n
    Content-Disposition: form-data; name="password"\r\n
    \r\n
    qq\r\n
    --1BEF0A57BE110FD467A--\r\n

    Теперь давайте разбираться в том что написано. :) Я специально выделил некоторые символы \r\n жирным, чтобы они не сливались с данными. Присмотревшись внимательно можно заметить поле boundary после Content-Type. Это поле задает разделитель разделов — границу. В качестве границы может быть использована строка, состоящая из латинских букв и цифр, а так же из еще некоторых символов (к сожалению, не помню каких еще). В теле запроса в начало границы добавляется '--', а заканчивается запрос — границей, к которой символы '--' добавляются еще и в конец. В нашем запросе два раздела, первый описывает поле login, а второй поле password. Content-Disposition (тип данных в разделе) говорит, что это будут данные из формы, а в поле name задается имя поля. На этом заголовок раздела заканчивается и далее следует область данных раздела, в котором помещается значение поля (кодировать значение не требуется!).

    Хочу обратить Ваше внимание та то, что в заголовках разделов не надо использовать Content-Length, а вот в заголовке запроса надо и его значение является размером всего Entity-Body, стоящего после второго \r\n, следующего за Content-Length: 209\r\n. Т.е. Entity-Body отделяется от заголовка дополнительным переводом строки (что можно заметить и в разделах).

    А теперь давайте напишем запрос для передачи файла.

    POST http://www.site.ru/postnews.html HTTP/1.0\r\n
    Host: www.site.ru\r\n
    Referer: http://www.site.ru/news.html\r\n
    Cookie: income=1\r\n
    Content-Type: multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n
    Content-Length: 491\r\n
    \r\n
    --1BEF0A57BE110FD467A\r\n
    Content-Disposition: form-data; name="news_header"\r\n
    \r\n
    Пример новости\r\n
    --1BEF0A57BE110FD467A\r\n
    Content-Disposition: form-data; name="news_file"; filename="news.txt"\r\n
    Content-Type: application/octet-stream\r\n
    Content-Transfer-Encoding: binary\r\n
    \r\n
    А вот такая новость, которая лежит в файле news.txt\r\n
    --1BEF0A57BE110FD467A--\r\n

    В данном примере в первом разделе пересылается заголовок новости, а во втором разделе пересылается файл news.txt. Внимательный да увидит поля filename и Content-Type во втором разделе. Поле filename задает имя пересылаемого файла, а поле Content-Type — тип данного файла. Application/octet-stream говорит о том, что это стандартный поток данных, а Content-Transfer-Encoding: binary говорит на о том, что это бинарные данные, ничем не закодированные.

    Очень важный момент. Большинство CGI скриптов написано умными людьми, поэтому они любят проверять тип пришедшего файла, который стоит в Content-Type. Зачем? Чаще всего закачка файлов на сайтах используется для получения картинок от посетителя. Так вот, браузер сам пытается определить что за файл посетитель хочет отправить и вставляет соответствующий Content-Type в запрос. Скрипт его проверяет при получении, и, например, если это не gif или не jpeg игнорирует данный файл. Поэтому при "ручном" формировании запроса позаботьтесь о значении Content-Type, чтобы оно было наиболее близким к формату передаваемого файла.

    image/gif для gif
    image/jpeg для jpeg
    image/png для png
    image/tiff для tiff (что используется крайне редко, уж больно емкий формат)

    В нашем примере формируется запрос, в котором передается текстовый файл. Точно так же формируется запрос для передачи бинарного файла.
    4. Постскриптум.

    Думаю, что о передаче запросов на сервер не стоит рассказывать подробно. Это уже дело чисто РНР техники :). Достаточно внимательно прочитать раздел о функциях работы с сокетами, или о функциях модуля CURL в официальной документации РНР.

    Из выше сказанного, надеюсь теперь понятно, почему вопрос: "Как мне сформировать POST запрос, используя функцию header?" — бессмысленен. Функция header(string) добавляет запись только в заголовок запроса, но никак не в тело запроса.

    Есть еще один тип запросов — Content-Type: multipart/mixed, надеюсь после прочтения данной статьи Вы легко разберетесь с данным типом сами.

    (с) ХЗ кто. уже и не помню.
     
    #11 nc.STRIEM, 22 May 2007
    Last edited: 22 May 2007
    2 people like this.
  12. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    nc.STRIEM, легче было ссылку дать или хотя бы копирайты поставил бы =)
     
  13. x-treem

    x-treem Elder - Старейшина

    Joined:
    8 Nov 2006
    Messages:
    130
    Likes Received:
    16
    Reputations:
    0
    спасибо всем кто помог) ток щас в инет вышел
     
    1 person likes this.
  14. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    легче.
    Но данная шнягу была у меня в txt файле, а где и когда я ее скачивал не имею представления.