RFpro.ru: Программирование на PHP

  Все выпуски  

RFpro.ru: Программирование на PHP


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Matrix
Статус: 3-й класс
Рейтинг: 404
∙ повысить рейтинг »
vladisslav
Статус: 5-й класс
Рейтинг: 212
∙ повысить рейтинг »
Калеев Владимир Викторович
Статус: 5-й класс
Рейтинг: 142
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / PHP

Номер выпуска:1160
Дата выхода:19.09.2009, 20:00
Администратор рассылки:Товарищ Бородин, Академик
Подписчиков / экспертов:620 / 176
Вопросов / ответов:1 / 5
IRC-канал по теме:#php

Вопрос № 172160: Доброго времени суток! Мне нужно было сделать следующую вещь: форму, где вводится логин и пароль, эти данные отсылаются серверу, оттуда приходит код ошибки или ответ, что авторизация прошла успешно - в последнем случае нужно ввести имя файла для о...



Вопрос № 172160:

Доброго времени суток!
Мне нужно было сделать следующую вещь: форму, где вводится логин и пароль, эти данные отсылаются серверу, оттуда приходит код ошибки или ответ, что авторизация прошла успешно - в последнем случае нужно ввести имя файла для отправки на сервер. Так вот, я при ответе сервера об успешной авторизации создаю в рнр-программе html - форму, которая принимает имя файла и возвращает его в эту же рнр-программу. Соответственно, соединение у меня разрывается после выполнения скрипта, и нужно заного авторизоваться, а нужно чтобы соединение не разрывалось, и можно было просто отправить команду с именем файла - помогите, как это можно сделать? В приложении привожу только рнр-файл, без хтмл

Отправлен: 14.09.2009, 10:38
Вопрос задал: Смирнов Павел Владимирович, Посетитель
Всего ответов: 5
Страница вопроса »


Отвечает BahuL, 4-й класс :
Здравствуйте, Смирнов Павел Владимирович.
Используйте сессии.
В начале документа начните сессию. После успешной авторизации занесите в сессию данные, что авторизация прошла успешно. Далее, если в сессии есть отметка, что авторизация пройдена выводите форму отправки файла ну и соответственно обрабатываете принятый файл, если нет то выводите форму авторизации.

Ответ отправил: BahuL, 4-й класс
Ответ отправлен: 14.09.2009, 11:06

Оценка ответа: 3
Комментарий к оценке:
С сессиями было бы проще, но подключаться все равно дважды придется!

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 254162 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Rok-set, Студент :
    Здравствуйте, Смирнов Павел Владимирович!
    Код приводить не буду, так как это довольно громоздко, а вкратце опишу теорию.
    способ чтобы не пользоватяься сессиями (лично мое мнение - мне сессии не нравятся)

    1 - выводим страницу авторизации.
    2 - проверяем авторизацию и формируем страницу для передачи файла. в эту страницу включаем два невидимых поля "имя" и "пароль" с данными, которые отправлял пользователь
    3 - проверяем опять имя и пароль пользователя и загружаем файл

    в итоге если у пользователя нету этих двух полей - выводим ему страницу авторизации. если есть (сформированы скриптом) - продолжаем работу.

    немного модифицировав код, имя и пароль пользователя можно хранить в cookies. а при каждом обращении к сайту - проверять их наличие. так работает большинство современных сайтов. если при установке cookies указать "время жизни", то пользователю после авотризации можно будет заходить на сайт даже через несколько д ней, миную опять процедуру авторизации

    Ответ отправил: Rok-set, Студент
    Ответ отправлен: 14.09.2009, 15:57

    Оценка ответа: 4
    Комментарий к оценке:
    Куки сохранят пароль, а этого нельзя делать в данном случае...

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 254176 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Maska, Студент :
    Здравствуйте, Смирнов Павел Владимирович!

    Существует несколько способов решения проблемы:
    1. Запоминать пароль и логин в виде переменных, но это противоречит принципам безопасности, так как данные легко прочитать, посмотрев код, а также подметить, Почти тоже самое, что и передавать данные методов get и считывать данные по ссылке;
    2. С помощью файла cookie;
    3. С помощью ссесий;
    4. Комбинированный - cookie и сессии.

    Более подробно о методах авторизации и хранения данных (логин и пароль) расcказано в статье по ссылке: http://www.tisbi.ru/resource/lib/Eltext/PHP/Glava%208/GL8.htm

    C уважением, maska!

    Ответ отправил: Maska, Студент
    Ответ отправлен: 15.09.2009, 03:10

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 254197 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Зернов Александр, 1-й класс :
    Здравствуйте, Смирнов Павел Владимирович.

    Используйте механизм сессий. Очень подробное объяснение с примерами http://www.phpfaq.ru/sessions

    Ответ отправил: Зернов Александр, 1-й класс
    Ответ отправлен: 16.09.2009, 19:47

    Оценка ответа: 3
    Комментарий к оценке:
    Сессии там конечно объяснены, но здесь не подходят

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 254267 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает HookEst, Специалист :
    Здравствуйте, Смирнов Павел Владимирович.
    Ну раз уж

    © Цитата:
    только после успешного прохождения авторизации выбирается, какой файл отправлять.
    остается только создавать отдельный процесс...
    Например, очень упрощенный пример того, как это можно сделать, с синхронизацией с помощью файлов...
    т.к. свободного сокета под рукой не оказалось, мой процесс держит открытым не сокет, а просто файл, но с сокетами смысл будет тот же...
    файл процесса, proc.php:
    Код:
    <?php
    set_ time_limit(120);
    ignore_user_abort(true);
    apache_setenv('no-gzip', 1);
    ini_set('zlib.output_compression', 0);
    ini_set('implicit_flush', 1);

    $process = @$_SERVER['argv'][0];
    if (empty($process))
    exit();

    $prc = "{$process}.prc";
    file_put_contents($prc, time());

    $in = "{$process}.in";
    $out = "{$process}.out";
    $sock = fopen("socket.txt", "w");

    file_put_contents($out, "START: " . time());

    flush();
    flush();
    flush();

    for(;;) {
    $msg = @file_get_contents($in);
    if (!empty($msg)) {
    if ($msg == "EXIT") {
    fclose($sock);
    file_put_contents($out, "EXIT: " . time());
    @unlink($prc);
    @unlink($in);
    break;
    } else {
    fwrite($sock, $msg);
    file_put_contents($out, "MSG: " . $msg);
    }
    @unlink($in);
    }
    }

    ?>

    и "фронт" index.php:

    Код:
    <pre>
    <?php
    if (empty($_REQUEST['process'])) {
    $process = md5(time() . rand() . 'salt');
    fclose(fopen("http://{$_SERVER['SERVER_NAME']}/proc.php?{$process}", "r"));
    $infile = "{$process}.in";
    $outfile = "{$process}.out";

    $msg = @file_get_contents($outfile);
    if (empty($msg)) {
    echo "Could not create process!\n";
    } else {
    echo $msg;
    ?>
    <form action="<?php echo $_SERVER['PHP_SELF']?>">
    <input type="hidden" name="process" value="<?php echo $process ?>">
    <input name="command">
    <input type="submit">
    </form>
    <?php
    }
    } elseif (empty($_REQUEST['command'])) {
    echo "Command is empty!\n";
    ?>
    <form action="<?php echo $_SERVER['PHP_SELF']?>">
    <input type="hidden" name="process" value="<?php echo $_REQUEST['process']?>">
    <input name="command">
    <input type="submit">
    </form>
    <?php
    } else {
    $process = $_REQUEST['process'];
    if (!file_exists("{$process}.prc"))
    die("Process not found!");
    $cmd = $_REQUEST['command'];
    $infile = "{$process}.in";
    $outfile = "{$process}.out";
    file_put_contents($infile, $cmd);
    sleep(3);
    $msg = @file_get_contents($outfile);
    echo "Command: $cmd\nResponse: $msg\n";
    if ($cmd == "EXIT")
    @ unlink($outfile);
    ?>
    <form action="<?php echo $_SERVER['PHP_SELF']?>">
    <input type=&quo t;hidden" name="process" value="<?php echo $process ?>">
    <input name="command">
    <input type="submit">
    </form>
    <?php
    }
    ?>
    </pre>


    Успехов.

    зы а все эти разговоры про сессии/куки/пароли к теме не относятся...

    Ответ отправил: HookEst, Специалист
    Ответ отправлен: 18.09.2009, 05:38

    Оценка ответа: 5
    Комментарий к оценке:
    Еще не успел попробовать, но, думаю, то, что нужно - спасибо!

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 254325 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.8 от 28.08.2009

    В избранное