id: Гость   вход   регистрация
текущее время 03:52 26/04/2024
Владелец: SATtva (создано 12/09/2008 21:22), редакция от 12/09/2008 21:22 (автор: SATtva) Печать
Категории: софт, сайт проекта, ошибки и баги
http://www.pgpru.com/Новости/2008/ТехническиеПроблемыССайтом
создать
просмотр
редакции
ссылки

12.09 // Технические проблемы с сайтом


В течение последних дней несколько человек поставили меня в известность о технических проблемах на сайте:


  • Нет доступа к страницам авторизации, настроек и регистрации — во всех случаях браузер выдаёт ошибку о некорректном редиректе. (В частности, это не даёт легитимным пользователям авторизоваться на сайте, но все те, кто имеют авторизованные cookie от прошлых сеансов, могут продолжать работать под своими учётными записями до истечения срока авторизации.)
  • Не работают службы сайта, связанные с обработкой данных OpenPGP — выдаётся ошибка CGI-враппера.

Все эти случаи подтверждены. Первые по-видимому связаны с принудительным перенаправлением на HTTPS, установленным на этих страницах. Вторые — с вызовом CGI-обёртки, передающей данные бэк-энду GnuPG. По какой причине всё это вдруг вышло из строя — непонятно; может быть хостинг-провайдер произвёл изменение каких-то настроек сервера, не проинформировав об этом. В любом случае, до воскресенья у меня не будет времени разбираться в ситуации. Прошу проявить терпение.


SATtva

Источник: https://www.pgpru.com


 
— SATtva (14/09/2008 13:26)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Ситуация прояснилась: хостинг-провайдер по какой-то причине отключил экспорт переменных Apache. Код защищённых страниц (например, страницы авторизации) полагается на значение глобальных переменных $_SERVER[...] для определения протокола доступа клиента к странице: если это не HTTPS, происходит принудительный редирект. Соответственно, при отсутствии переменной (в PHP это пустое значение) происходит бесконечное число редиректов, и любой вразумительный браузер блокирует открытие такой страницы. С CGI-враппером функций OpenPGP та же история — скрипт просто не получает необходимых переменных окружения от сервера.

Хостеру отправлен запрос с просьбой прокомментировать ситуацию или, если это ошибка, исправить её.
— Гость (16/09/2008 22:05)   <#>
Ну и что говорит slavehost? Кстати, я когда обновляюсь, у меня тоже часто многое что перестаёт работать.
— SATtva (18/09/2008 13:58)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Проблема с логином и прочими HTTPS-страницами устранена.

А какой такой slavehost? :-)
— unknown (18/09/2008 16:04, исправлен 18/09/2008 16:06)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664


:-)
— SATtva (18/09/2008 16:13)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Правда, если открыть мой, unknown'а или чей-нибудь ещё профиль с ключом, эта благостная картина немного подпортится. Что там за беда с CGI, пока не разбирался.
— Гость (18/09/2008 18:35)   <#>
Проблема с логином и прочими HTTPS-страницами устранена.

Хостер пофиксил свои настройки?
— SATtva (18/09/2008 19:09)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Отчасти. Всё равно пришлось немного переписать код.
— Гость (04/10/2008 14:06)   <#>
Проблемы всё ещё здесь. http://www.pgpru.com/forum/off.....hupodpisatjpgpkljuch, например.
И некоторые другие страницы.
— SATtva (04/10/2008 21:30, исправлен 04/10/2008 21:30)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Почти весь сегодняшний день потратил на поиск корня зла причин ошибки. И наконец установил причину. Проблема решена, функциональность сайта восстановлена в полном объёме. С чем всех поздравляю.
— Гость (05/10/2008 10:41)   <#>
И какая была причина?
— SATtva (05/10/2008 11:11)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Ну, если это интересно... Поскольку виртуальный хостинг накладывает ограничения на прямое исполнение программ из PHP функциями exec(), popen() и т.п. (видимо, в целях безопасности), используется скрипт-обёртка на Perl, вызываемый из основной PHP-программы как простая веб-страница через обёртку fopen(). При вызове скрипта ему передаются все необходимые параметры (в HTTP-запросе), с которыми он должен выполнить gpg. А результат работы gpg в стандартном выводе загружается в вызвавшую PHP-программу, где происходит вся дальнейшая обработка.

В какой-то момент вызов Perl-скрипта через fopen() перестал создавать поток, что стало приводить к ошибкам "openSpace-GPG: unable to open CGI wrapper" везде, где требовался вызов gpg. После длительной диагностики удалось установить причину: при формировании контекста для потока fopen() функцией stream_context_create() параметр method передавался в нижнем регистре (т.е. post или get). Серверу в какой-то момент это почему-то перестало нравится, и такие соединения он начал отвергать. Перевод значения в верхний регистр снял проблему.

Но тут выявилась другая: одни вызовы gpg выполнялись корректно, а другие из-за чего-то перестали производить вывод. То есть поток открывался корректно, корректно происходило исполнение gpg, но стандартный вывод оставался пуст. При этом прямой вызов Perl-скрипта в браузере отрабатывал корректно, весь вывод gpg успешно выводился. Как выяснилось, и здесь проблема заключалась в обёртке fopen(). В тех случаях, где метод запроса был POST с установленным хидером "Content-type: application/x-www-form-urlencoded", программа получала вывод от gpg и успешно выполнялась. Там же, где использовался метод GET, вывод был пуст (что особенно удивляет). Теперь все вызовы скрипта производятся POST-запросом.

Очередное доказательство тому, что взаимодействие множества разноплановых компонентов не добавляет системе надёжности.
— poptalk (05/10/2008 13:17)   профиль/связь   <#>
комментариев: 271   документов: 13   редакций: 4
[offtopic]
Поскольку виртуальный хостинг накладывает ограничения на прямое исполнение программ из PHP функциями exec(), popen() и т.п. (видимо, в целях безопасности), используется скрипт-обёртка на Perl, вызываемый из основной PHP-программы как простая веб-страница через обёртку fopen().

Знакомый приём. :) Скорее проблема в том, что нестрого следуют стандартам. Это просто обязательно при соединении компонентов от разных производителей. А ещё проблема, что защита от хакеров делается самым простым способом, а не самым правильным. Сам safe-mode в PHP является отличным примером, как не надо делать. :) Да таких анекдотов у каждого наберётся: например, интернет-провайдер не отправляет письма, содержащие последовательность ".js". Видать, защищали глупых пользователей от JavaScript-вирусов. Или при публикации в блоге делаются неактивными ссылки, содержащие "cgi-bin". Тоже "защита" от чего-то. :)
[/offtopic]
— Гость (05/10/2008 15:27)   <#>
Поскольку виртуальный хостинг накладывает ограничения на прямое исполнение программ из PHP функциями exec(), popen() и т.п. (видимо, в целях безопасности), используется скрипт-обёртка на Perl, вызываемый из основной PHP-программы как простая веб-страница через обёртку fopen().
Ага, а разрешать через fopen() получать веб-страницы – безопасно :)

А какой именно тариф у masterhost'а? Советую обратить внимание на американские хостинги. Там обычно за небольшие деньги дают гораздо больше возможностей. К примеру, доступ к php.ini или сырым логам веб-сервера.
— SATtva (05/10/2008 15:45)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Ага, а разрешать через fopen() получать веб-страницы – безопасно :)

Наверное, запрет на прямое исполнение программного кода — просто защита от быдлокодеров, которые найдут любую возможность отстрелить себе ногу. Делать то же самое через промежуточный cgi-скрипт они не догадаются. :-)
— Гость (05/10/2008 17:41)   <#>
Наверное, запрет на прямое исполнение программного кода — просто защита от быдлокодеров, которые найдут любую возможность отстрелить себе ногу. Делать то же самое через промежуточный cgi-скрипт они не догадаются. :-)

Хостеру-то какое до них дело? Пусть ломают в пределах своего аккаунта что угодно :)
А речь о том, что allow_url_fopen – сама по себе опасная опция, наверное, даже более опасная, чем запрещённые exec() и компания. Ведь для того, чтобы использовать exec(), требуется найти уязвимость в движке и, в общем-то, взломщик мало что с этого поимеет (кроме удобства), ведь практически всё, что можно сделать через unix-консоль, можно делать и через PHP. А вот allow_url_fopen как раз создаёт уязвимости.
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3