ThyBzi
Новичок
POST без формы + HTTP-аутентификация
Поискал в форуме и факах, ничего подобного не нашёл.
Написал в этот раздел, так как считаю, что тема напрямую касается cURL (а ведь это, насколько я понял, одна из библиотек PECL).
Значится, суть проблемы такая. Имеем админку к сайту, в ней есть (в т.ч.) два файла: index.php, через который работает весь юзерский интерфейс (в т.ч. удаления/изменения/добавления событий в БД), и dbrw.php, который напрямую работает с БД, в зависимости от того, какие action и id (и другие данные) ему пришли по POSTу от index.php, а затем отсылает страницу обратно к index.php.
С добавлением нового события и удалением имеющегося проблем не возникает, нужные данные передаются постом от index к dbrw, выполняется соответствующий запрос, и всё путём.
Проблема возникает, когда событие нужно редактировать. Т.е.:
1) передать странице dbrw.php постом переменные action = edit и id = нужный_id (на самом деле передаётся ещё и section, которое соответствует типу записи в БД — из какой таблицы и какие поля вытащить);
2) составить запрос на выборку имеющихся данных (полей много, и в зависимости от section их число и имена меняются);
3) и то, что собственно не получается: передать эти данные обратно index.php.
Возможные варианты решения, которые я рассматривал:
1) Передать данные GETом.
Чем плохо. Далеко не любые данные можно безопасно передать через адресную строку (особенно касается длинных текстов, в т.ч. содержащих переносы строк и др. — эти переносы потеряются, и думаю, не только они)
2) Создать форму с методом POST, в ней все значения вписать hidden-ами, а затем отправить форму средствами JavaScript.
Чем плохо. Неэлегантое решение, ибо это «выкрутасы» (или выкручивание . К тому же, в HTML-код страницы, которая заведомо ничего не должна показывать юзеру, выводится огромная форма. А ещё я считаю плохим стилем доверять JS выполнение важных операций.
3) Сохранить данные в сессию.
Чем плохо. Во-первых, захламление сессии огромными объёмами данных. Если я ничего не путаю, данные сессии хранятся на сервере в специальных файлах, а объёмы текстов, вытащенных из базы, могут быть весьма и весьма велики. Также возникают сложности с тем, как затем интерпретировать приходящие данные. Либо нужно писать все данные в одну переменную (типа $_SESSION["form_data"]), разбивая их по образу и подобию GETовой строки: var1=12&var2=345=var3=gdfgd и т.д. (или ещё каким-то образом отделять переменные друг от друга), — либо нужно каким-то образом узнавать, из каких переменных читать данные. Как-то это всё коряво.
4) Отправить данные POSTом без использования форм. Это был бы идеальный вариант. Пошарил в инете на эту тему и выяснил, что подобные вещи позволяет делать cURL…
Если вы не забыли, речь идёт об админке, соответственно там используется аутентификация (в данном случае — HTTPшная, через 401 «ошибку»). Т.е. если тупо передать нужные данные POSTом, скрипту ответят этой самой 401-й ошибкой.
Попытался совместить примеры передачи данных POSTом и HTTP-аутентификации из мануала по cURL (http://www.zend.com/pecl/tutorials/curl.php), всё равно выдаётся ошибка 401.
Вот код:
где:
$referer — это http-реферер ) т.е. index.php?section=имя_раздела
$_SESSION["username"] и $_SESSION["password"] — хранящиеся в сессии данные, введённые авторизованным юзером (для чистоты эксперимента пока отключил их шифрование перед записью в переменные сессии).
BuildVarStr($data2post) — это строка «GET-вида» (var1=12&var2=345=var3=gdfgd). Самописная функция BuildVarStr() формирует такую строку из массива ("var1" => 12, "var2" => 345...). В мануале по cURL в примере используется строка именно такого вида.
Пробовал комментировать параметры, лишние на моё взгляд. Пробовал не эхить $result, а редиректить на $referer… Результат один — 401 ошибка и хоть ты тресни.
Уважаемые члены сообщества! Буду весьма признателен, если укажите мне на местонахождение и суть моей ошибки в ДНК. ) А особенно — путей исправления оной и путей решение данной задачи. Заранее благодарен.
P.S. cURL включен, разумеется. ))
Поискал в форуме и факах, ничего подобного не нашёл.
Написал в этот раздел, так как считаю, что тема напрямую касается cURL (а ведь это, насколько я понял, одна из библиотек PECL).
Значится, суть проблемы такая. Имеем админку к сайту, в ней есть (в т.ч.) два файла: index.php, через который работает весь юзерский интерфейс (в т.ч. удаления/изменения/добавления событий в БД), и dbrw.php, который напрямую работает с БД, в зависимости от того, какие action и id (и другие данные) ему пришли по POSTу от index.php, а затем отсылает страницу обратно к index.php.
С добавлением нового события и удалением имеющегося проблем не возникает, нужные данные передаются постом от index к dbrw, выполняется соответствующий запрос, и всё путём.
Проблема возникает, когда событие нужно редактировать. Т.е.:
1) передать странице dbrw.php постом переменные action = edit и id = нужный_id (на самом деле передаётся ещё и section, которое соответствует типу записи в БД — из какой таблицы и какие поля вытащить);
2) составить запрос на выборку имеющихся данных (полей много, и в зависимости от section их число и имена меняются);
3) и то, что собственно не получается: передать эти данные обратно index.php.
Возможные варианты решения, которые я рассматривал:
1) Передать данные GETом.
Чем плохо. Далеко не любые данные можно безопасно передать через адресную строку (особенно касается длинных текстов, в т.ч. содержащих переносы строк и др. — эти переносы потеряются, и думаю, не только они)
2) Создать форму с методом POST, в ней все значения вписать hidden-ами, а затем отправить форму средствами JavaScript.
Чем плохо. Неэлегантое решение, ибо это «выкрутасы» (или выкручивание . К тому же, в HTML-код страницы, которая заведомо ничего не должна показывать юзеру, выводится огромная форма. А ещё я считаю плохим стилем доверять JS выполнение важных операций.
3) Сохранить данные в сессию.
Чем плохо. Во-первых, захламление сессии огромными объёмами данных. Если я ничего не путаю, данные сессии хранятся на сервере в специальных файлах, а объёмы текстов, вытащенных из базы, могут быть весьма и весьма велики. Также возникают сложности с тем, как затем интерпретировать приходящие данные. Либо нужно писать все данные в одну переменную (типа $_SESSION["form_data"]), разбивая их по образу и подобию GETовой строки: var1=12&var2=345=var3=gdfgd и т.д. (или ещё каким-то образом отделять переменные друг от друга), — либо нужно каким-то образом узнавать, из каких переменных читать данные. Как-то это всё коряво.
4) Отправить данные POSTом без использования форм. Это был бы идеальный вариант. Пошарил в инете на эту тему и выяснил, что подобные вещи позволяет делать cURL…
Если вы не забыли, речь идёт об админке, соответственно там используется аутентификация (в данном случае — HTTPшная, через 401 «ошибку»). Т.е. если тупо передать нужные данные POSTом, скрипту ответят этой самой 401-й ошибкой.
Попытался совместить примеры передачи данных POSTом и HTTP-аутентификации из мануала по cURL (http://www.zend.com/pecl/tutorials/curl.php), всё равно выдаётся ошибка 401.
Вот код:
PHP:
$ch = curl_init(); // initialize curl handle
curl_setopt($ch, CURLOPT_URL, $referer); // set url to post to
curl_setopt($ch, CURLOPT_USERPWD, "{$_SESSION["username"]}:{$_SESSION["password"]}");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable
curl_setopt($ch, CURLOPT_TIMEOUT, 3); // times out after 4s
curl_setopt($ch, CURLOPT_POST, 1); // set POST method
curl_setopt($ch, CURLOPT_POSTFIELDS, BuildVarStr($data2post)); // add POST fields
$result = curl_exec($ch); // run the whole process
curl_close($ch);
echo $result;
$referer — это http-реферер ) т.е. index.php?section=имя_раздела
$_SESSION["username"] и $_SESSION["password"] — хранящиеся в сессии данные, введённые авторизованным юзером (для чистоты эксперимента пока отключил их шифрование перед записью в переменные сессии).
BuildVarStr($data2post) — это строка «GET-вида» (var1=12&var2=345=var3=gdfgd). Самописная функция BuildVarStr() формирует такую строку из массива ("var1" => 12, "var2" => 345...). В мануале по cURL в примере используется строка именно такого вида.
Пробовал комментировать параметры, лишние на моё взгляд. Пробовал не эхить $result, а редиректить на $referer… Результат один — 401 ошибка и хоть ты тресни.
Уважаемые члены сообщества! Буду весьма признателен, если укажите мне на местонахождение и суть моей ошибки в ДНК. ) А особенно — путей исправления оной и путей решение данной задачи. Заранее благодарен.
P.S. cURL включен, разумеется. ))