Ситуация: Есть сайт http://www.dphoto.com.ua Содержит админскую часть по адресу http://www.dphoto.com.ua/admin Проблема в том, что на локальном Apache код авторизации, который подключен инструкцией include для каждой странички админки, работает отлично. Всё нормально вводится, достаётся из базы юзеров , сравнивается, если запрошен "админ" - пускает. А вто после того, как загрузил сайт к хостеру. Перестал пускать в админку. И вроде бы всё правильно. ПРоверяю как заполнена таблица userlist (список аутентифицированных юзеров) в базе MySQL на сервере - всё правильно. Код, подключаемый для проверки привожу ниже = тоже не менялся и ничем от локальной версии не отличается. Но там работает, а у хостера - нет. Помогите справиться с проблемой пожалуйста. В каком направлении начинать рыть? Как бы проверить что и как передаётся в/из таблицы.. Как бы отладить? ЗЫ. Права доступа к файлу, который подключается в include проверил - доступен для чтения. То есть вроде бы нормально всё и тут. Итак код, проверки: PHP: <?php include ("bloks/bd.php"); /* соединение с БД*/ if (!isset($_SERVER['PHP_AUTH_USER'])) { Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); Header ("HTTP/1.0 401 Unauthorized"); exit(); } else { if (!get_magic_quotes_gpc()) { $_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']); $_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']); } $query = "SELECT pass FROM userlist WHERE user='".$_SERVER['PHP_AUTH_USER']."'"; $lst = @mysql_query($query); if (!$lst) { Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); Header ("HTTP/1.0 401 Unauthorized"); exit(); } if (mysql_num_rows($lst) == 0) { Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); Header ("HTTP/1.0 401 Unauthorized"); exit(); } $pass = @mysql_fetch_array($lst); if ($_SERVER['PHP_AUTH_PW']!= $pass['pass']) { Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); Header ("HTTP/1.0 401 Unauthorized"); exit(); } } ?> Этот код хранится в файле lock.php и подключается на каждой страничке админской части сайта include ("lock.php");
ДА вот ещё что. Приведу на всяк случай файл php.ini от хостера. Может там косяк? PHP: engine = 1 zend.ze1_compatibility_mode = short_open_tag = 1 asp_tags = precision = 14 y2k_compliance = 1 output_buffering = 4096 zlib.output_compression = implicit_flush = unserialize_callback_func = serialize_precision = 100 allow_call_time_pass_reference = safe_mode = safe_mode_gid = 1 safe_mode_include_dir = safe_mode_exec_dir = safe_mode_allowed_env_vars = PHP_ safe_mode_protected_env_vars = LD_LIBRARY_PATH disable_functions = disable_classes = highlight.string = #DD0000 highlight.comment = #FF9900 highlight.keyword = #007700 highlight.bg = #FFFFFF highlight.default = #0000BB highlight.html = #000000 expose_php = 1 max_execution_time = 30 max_input_time = 60 memory_limit = 32M error_reporting = 6135 display_errors = display_startup_errors = log_errors = 1 log_errors_max_len = 1024 ignore_repeated_errors = ignore_repeated_source = report_memleaks = 1 track_errors = html_errors = error_log = /hsphere/local/var/httpd/logs/php_error.log variables_order = EGPCS register_globals = 1 register_long_arrays = 1 register_argc_argv = 1 auto_globals_jit = 1 post_max_size = 8M magic_quotes_gpc = 1 magic_quotes_runtime = magic_quotes_sybase = auto_prepend_file = auto_append_file = default_mimetype = text/html always_populate_raw_post_data = 1 include_path = .:/hsphere/shared/apache/libexec/php5ext/php/ doc_root = user_dir = extension_dir = /hsphere/shared/apache/libexec/php5ext/ cgi.fix_pathinfo = 1 file_uploads = 1 upload_tmp_dir = upload_max_filesize = 10M allow_url_fopen = 1 allow_url_include = default_socket_timeout = 60 auto_detect_line_endings = 1 [Syslog] define_syslog_variables = [mail function] sendmail_path = /usr/sbin/sendmail -t -i mail.force_extra_parameters = [SQL] sql.safe_mode = [ODBC] odbc.allow_persistent = odbc.check_persistent = 1 odbc.max_persistent = -1 odbc.max_links = -1 odbc.defaultlrl = 4096 odbc.defaultbinmode = 1 [MySQL] mysql.allow_persistent = mysql.max_persistent = -1 mysql.max_links = -1 mysql.default_port = 3306 mysql.default_socket = /var/lib/mysql/mysql.sock mysql.default_host = localhost mysql.default_user = mysql.default_password = mysql.connect_timeout = 60 mysql.trace_mode = [MySQLi] mysqli.max_links = -1 mysqli.default_port = 3306 mysqli.default_socket = /var/lib/mysql/mysql.sock mysqli.default_host = localhost mysqli.default_user = mysqli.default_pw = mysqli.reconnect = [PostgresSQL] pgsql.allow_persistent = pgsql.auto_reset_persistent = pgsql.max_persistent = -1 pgsql.max_links = -1 pgsql.ignore_notice = 0 pgsql.log_notice = 0 [dbx] dbx.colnames_case = lowercase [bcmath] bcmath.scale = 0 [Session] session.save_path = /tmp session.save_handler = files session.use_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.bug_compat_42 = 0 session.bug_compat_warn = 1 session.referer_check = session.entropy_length = 0 session.entropy_file = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.hash_function = 0 session.hash_bits_per_character = 5 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" [Assertion] assert.active = 1 assert.warning = 1 assert.bail = assert.callback = assert.quiet_eval = 0 [Sockets] sockets.use_system_read = 1 [mbstring] mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = mbstring.detect_order = auto mbstring.substitute_character = mbstring.func_overload = 0 [exif] exif.encode_unicode = ISO-8859-15 exif.decode_unicode_motorola = UCS-2BE exif.decode_unicode_intel = UCS-2LE exif.encode_jis = exif.decode_jis_motorola = JIS exif.decode_jis_intel = JIS [soap] soap.wsdl_cache_enabled = 1 soap.wsdl_cache_dir = /tmp soap.wsdl_cache_ttl = 86400 extension=imagick.so [Zend] zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.3.0 zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.0 zend_optimizer.version=3.3.0 zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so
oleg67 Возможно, на сервере криво подключен PHP (как CGI, а не как модуль Апача, в этом случае переменные PHP_AUTH_XXX не работают). Zend Optimizer также мог подгадить, жутко нестабильная приблуда. P.S. Вам не лениво было четыре раза писать одно и то же (я про отправку заголовков)? Неужели нельзя было как-то покрасивее? P.P.S. Скрипт уязвим к SQL-инъекции, отправленное посетителем имя пользователя никак не экранируется.
Ну вроде бы как раз-таки PHP работает в режиме CGI, как сообщила техподдержка. Ну так а что в таком случае делать?
to vs: Спасибо за совет. Но я не силён в PHP поэтому сложно понять о чём речь идёт. Всмысле сессии. Если это возможно - покажи как? Или дай ссылочку где об этом прочесть можно. Спасибо заранее.
oleg67 Я бы вежливо попросил техподдержку изменить сборку на сервере, тем более что у вас Апач стоит, ибо PHP, установленный как CGI, чреват проблемами, в том числе с безопасностью. Там нужно несколько минут работы (и прямые руки).
to Dagdamor: Демаешь согласятся менять сборку? Ради меня одного? Сомневаюсь. Не давно задал им вопрос как раз по этой проблемке и привёл исходник файла аутентификации. Так ответили, что дескать отладкой кода клиента они не занимаются. Что, впринципе, и понятно. Мммдддяяя.. Но попробовать можно, конечно попросить. За спрос в нос не дадут.
Ну вот... Что и требовалось доказать... [18.05.2008 18:09:50] Q: Понимаю, что врядли получу положительный ответ, но всё же рискну спросить. Вы не могли бы перенастроить PHP интерпритатор как модуль к Апачам, а не как CGI ? Если это возможно - сделайте пожалуйста. Жду ответа. Спасибо. ------------------------------------------------------- [18.05.2008 18:16:14] A: Добрый день. На виртуальном хостинге такое невозможно. Можем настроить вам php как модуль на выделенном сервере:
А какие ещё есть простые варианты решения данной проблемы? ТО есть сделать аутентификацию не сложной. Понимаю, что чем проще , тем уязвимее.
В сессиях ничего сложного и нету Могу посоветовать... А.А.Орлов "PHP. Полезные приемы" (в инете много видел линков на электронную версию) там есть про них и все вполне доступно написано + Manual PHP
oleg67 http://phpfaq.ru/sessions - здесь - что такое сессии и как работают Тебе нужно: заменить все $_SERVER на $_SESSION (мож и названия ключей поменять), на странице входа тебе нужно вместо окошка базовой аутинтефикации сделать HTML-форму входа. Назвать поле для ввода имени - PHP_AUTH_USER и поле ввода пароля - PHP_AUTH_PW.
Спасибо огромное за подсказку. ПРобовал так сделать. Вышло криво. Руки видать такие. Потом сделал проще - у хостера защитил папку с админкой с помощью .htaccess. Работает вроде бы нормально. Спасибо тебе огромное за помощь. А книжка эта у меня есть. Читал. Смотрел. ПРосто опыта мало. ВОт и бился, как рыба об лёд. Да ещё видать у хостера какие-то настройки PHP кривоватые. Кстати, прикол.. Я смотрел тот момент о котором говорил уважаемый Dagdamor: Всё работает в этом смысле. Переменные PHP_AUTH_PW и PHP_AUTH_USER нормально передаются в том коде что я приводил сначала. Только почему-то всё равно не работал тот код. Так и не въехал по какой причине. Возможно функция mysql_escape_string Как то не так работает на хосте? Вобщем фиг его поймёт. А проверил переменные так: PHP: ...... $a= var_dump($_SERVER['PHP_AUTH_PW']); $b= var_dump($_SERVER['PHP_AUTH_USER']); echo $a, $b; .......
Блин. Рано похвастался... На главной странице админки - всё путём. А на некоторых почему-то отшибло вывод форм для редактирования содержимого. Ммммдддяяяя... Ё-моё! И почему бы это, интересно?
oleg67 Понимаешь, не зная архитектуры админки, невозможно определить, в чем проблема. Попробуй включить ошибки - вверху каждого скрипта пропиши error_reporting(10);