За последние 24 часа нас посетили 20320 программистов и 1712 роботов. Сейчас ищут 1836 программистов ...

Помогите решить проблемку.

Тема в разделе "Вопросы от блондинок", создана пользователем oleg67, 18 май 2008.

  1. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    Ситуация:

    Есть сайт http://www.dphoto.com.ua
    Содержит админскую часть по адресу http://www.dphoto.com.ua/admin
    Проблема в том, что на локальном Apache код авторизации, который подключен инструкцией include для каждой странички админки, работает отлично. Всё нормально вводится, достаётся из базы юзеров , сравнивается, если запрошен "админ" - пускает. А вто после того, как загрузил сайт к хостеру. Перестал пускать в админку.
    И вроде бы всё правильно. ПРоверяю как заполнена таблица userlist (список аутентифицированных юзеров) в базе MySQL на сервере - всё правильно. Код, подключаемый для проверки привожу ниже = тоже не менялся и ничем от локальной версии не отличается. Но там работает, а у хостера - нет. Помогите справиться с проблемой пожалуйста.
    В каком направлении начинать рыть?
    Как бы проверить что и как передаётся в/из таблицы.. Как бы отладить?

    ЗЫ. Права доступа к файлу, который подключается в include проверил - доступен для чтения. То есть вроде бы нормально всё и тут.

    Итак код, проверки:

    PHP:
    1.  
    2.  
    3. <?php
    4. include ("bloks/bd.php"); /* соединение с БД*/
    5. if (!isset($_SERVER['PHP_AUTH_USER']))
    6.  
    7. {
    8.         Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
    9.         Header ("HTTP/1.0 401 Unauthorized");
    10.         exit();
    11. }
    12.  
    13. else {
    14.         if (!get_magic_quotes_gpc()) {
    15.                 $_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
    16.                 $_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
    17.         }
    18.  
    19.         $query = "SELECT pass FROM userlist WHERE user='".$_SERVER['PHP_AUTH_USER']."'";
    20.         $lst = @mysql_query($query);
    21.  
    22.         if (!$lst)
    23.         {
    24.             Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
    25.         Header ("HTTP/1.0 401 Unauthorized");
    26.         exit();
    27.         }
    28.  
    29.         if (mysql_num_rows($lst) == 0)
    30.         {
    31.            Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
    32.            Header ("HTTP/1.0 401 Unauthorized");
    33.            exit();
    34.         }
    35.  
    36.         $pass =  @mysql_fetch_array($lst);
    37.         if ($_SERVER['PHP_AUTH_PW']!= $pass['pass'])
    38.         {
    39.             Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
    40.            Header ("HTTP/1.0 401 Unauthorized");
    41.            exit();
    42.         }
    43.  
    44.  
    45. }
    46.  
    47.  
    48. ?>
    49.  
    Этот код хранится в файле lock.php и подключается на каждой страничке админской части сайта
    include ("lock.php");
     
  2. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    ДА вот ещё что.

    Приведу на всяк случай файл php.ini от хостера. Может там косяк?


    PHP:
    1.  
    2.   engine = 1
    3.   zend.ze1_compatibility_mode =
    4.   short_open_tag = 1
    5.   asp_tags =
    6.   precision = 14
    7.   y2k_compliance = 1
    8.   output_buffering = 4096
    9.   zlib.output_compression =
    10.   implicit_flush =
    11.   unserialize_callback_func =
    12.   serialize_precision = 100
    13.   allow_call_time_pass_reference =
    14.   safe_mode =
    15.   safe_mode_gid = 1
    16.   safe_mode_include_dir =
    17.   safe_mode_exec_dir =
    18.   safe_mode_allowed_env_vars = PHP_
    19.   safe_mode_protected_env_vars = LD_LIBRARY_PATH
    20.   disable_functions =
    21.   disable_classes =
    22.   highlight.string = #DD0000
    23.  highlight.comment = #FF9900
    24.  highlight.keyword = #007700
    25.  highlight.bg = #FFFFFF
    26.  highlight.default = #0000BB
    27.  highlight.html = #000000
    28.  expose_php = 1
    29.   max_execution_time = 30
    30.   max_input_time = 60
    31.   memory_limit = 32M
    32.   error_reporting = 6135
    33.   display_errors =
    34.   display_startup_errors =
    35.   log_errors = 1
    36.   log_errors_max_len = 1024
    37.   ignore_repeated_errors =
    38.   ignore_repeated_source =
    39.   report_memleaks = 1
    40.   track_errors =
    41.   html_errors =
    42.   error_log = /hsphere/local/var/httpd/logs/php_error.log
    43.   variables_order = EGPCS
    44.   register_globals = 1
    45.   register_long_arrays = 1
    46.   register_argc_argv = 1
    47.   auto_globals_jit = 1
    48.   post_max_size = 8M
    49.   magic_quotes_gpc = 1
    50.   magic_quotes_sybase =
    51.   auto_prepend_file =
    52.   auto_append_file =
    53.   default_mimetype = text/html
    54.   always_populate_raw_post_data = 1
    55.   include_path = .:/hsphere/shared/apache/libexec/php5ext/php/
    56.   doc_root =
    57.   user_dir =
    58.   extension_dir = /hsphere/shared/apache/libexec/php5ext/
    59.   cgi.fix_pathinfo = 1
    60.   file_uploads = 1
    61.   upload_tmp_dir =
    62.   upload_max_filesize = 10M
    63.   allow_url_fopen = 1
    64.   allow_url_include =
    65.   default_socket_timeout = 60
    66.   auto_detect_line_endings = 1
    67. [mail function]
    68.   sendmail_path = /usr/sbin/sendmail -t -i
    69.   mail.force_extra_parameters =
    70. [SQL]
    71.   sql.safe_mode =
    72. [ODBC]
    73.   odbc.allow_persistent =
    74.   odbc.check_persistent = 1
    75.   odbc.max_persistent = -1
    76.   odbc.max_links = -1
    77.   odbc.defaultlrl = 4096
    78.   odbc.defaultbinmode = 1
    79.   mysql.allow_persistent =
    80.   mysql.max_persistent = -1
    81.   mysql.max_links = -1
    82.   mysql.default_port = 3306
    83.   mysql.default_socket = /var/lib/mysql/mysql.sock
    84.   mysql.default_host = localhost
    85.   mysql.default_user =
    86.   mysql.default_password =
    87.   mysql.connect_timeout = 60
    88.   mysql.trace_mode =
    89. [MySQLi]
    90.   mysqli.max_links = -1
    91.   mysqli.default_port = 3306
    92.   mysqli.default_socket = /var/lib/mysql/mysql.sock
    93.   mysqli.default_host = localhost
    94.   mysqli.default_user =
    95.   mysqli.default_pw =
    96.   mysqli.reconnect =
    97. [PostgresSQL]
    98.   pgsql.allow_persistent =
    99.   pgsql.auto_reset_persistent =
    100.   pgsql.max_persistent = -1
    101.   pgsql.max_links = -1
    102.   pgsql.ignore_notice = 0
    103.   pgsql.log_notice = 0
    104. [dbx]
    105.   dbx.colnames_case = lowercase
    106. [bcmath]
    107.   bcmath.scale = 0
    108. [Session]
    109.   session.save_path = /tmp
    110.   session.save_handler = files
    111.   session.use_cookies = 1
    112.   session.name = PHPSESSID
    113.   session.auto_start = 0
    114.   session.cookie_lifetime = 0
    115.   session.cookie_path = /
    116.   session.cookie_domain =
    117.   session.cookie_httponly =
    118.   session.serialize_handler = php
    119.   session.gc_probability = 1
    120.   session.gc_divisor = 1000
    121.   session.gc_maxlifetime = 1440
    122.   session.bug_compat_42 = 0
    123.   session.bug_compat_warn = 1
    124.   session.referer_check =
    125.   session.entropy_length = 0
    126.   session.entropy_file =
    127.   session.cache_limiter = nocache
    128.   session.cache_expire = 180
    129.   session.use_trans_sid = 0
    130.   session.hash_function = 0
    131.   session.hash_bits_per_character = 5
    132.   url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
    133. [Assertion]
    134.   assert.active = 1
    135.   assert.warning = 1
    136.   assert.bail =
    137.   assert.callback =
    138.   assert.quiet_eval = 0
    139. [Sockets]
    140.   sockets.use_system_read = 1
    141. [mbstring]
    142.   mbstring.language = Japanese
    143.   mbstring.internal_encoding = EUC-JP
    144.   mbstring.http_input = auto
    145.   mbstring.http_output = SJIS
    146.   mbstring.encoding_translation =
    147.   mbstring.detect_order = auto
    148.   mbstring.substitute_character =
    149.   mbstring.func_overload = 0
    150. [exif]
    151.   exif.encode_unicode = ISO-8859-15
    152.   exif.decode_unicode_motorola = UCS-2BE
    153.   exif.decode_unicode_intel = UCS-2LE
    154.   exif.encode_jis =
    155.   exif.decode_jis_motorola = JIS
    156.   exif.decode_jis_intel = JIS
    157. [soap]
    158.   soap.wsdl_cache_enabled = 1
    159.   soap.wsdl_cache_dir = /tmp
    160.   soap.wsdl_cache_ttl = 86400
    161.   extension=imagick.so
    162.  
    163. [Zend]
    164. zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.3.0
    165. zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.0
    166. zend_optimizer.version=3.3.0
    167. zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so
    168. zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so
    169.  
     
  3. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    oleg67
    Возможно, на сервере криво подключен PHP (как CGI, а не как модуль Апача, в этом случае переменные PHP_AUTH_XXX не работают).
    Zend Optimizer также мог подгадить, жутко нестабильная приблуда.

    P.S. Вам не лениво было четыре раза писать одно и то же (я про отправку заголовков)? Неужели нельзя было как-то покрасивее? :)
    P.P.S. Скрипт уязвим к SQL-инъекции, отправленное посетителем имя пользователя никак не экранируется.
     
  4. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    Ну вроде бы как раз-таки PHP работает в режиме CGI, как сообщила техподдержка.
    Ну так а что в таком случае делать?
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    oleg67
    Переделай авторизацию на сессии.
     
  6. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    to vs: Спасибо за совет. Но я не силён в PHP поэтому сложно понять о чём речь идёт. Всмысле сессии.
    Если это возможно - покажи как? Или дай ссылочку где об этом прочесть можно.
    Спасибо заранее.
     
  7. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    oleg67
    Я бы вежливо попросил техподдержку изменить сборку на сервере, тем более что у вас Апач стоит, ибо PHP, установленный как CGI, чреват проблемами, в том числе с безопасностью. Там нужно несколько минут работы (и прямые руки).
     
  8. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    О! Вроде бы что-то надыбал в Гугле.. Спасибо по любому.
     
  9. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    to Dagdamor: Демаешь согласятся менять сборку? Ради меня одного? Сомневаюсь.
    Не давно задал им вопрос как раз по этой проблемке и привёл исходник файла аутентификации. Так ответили, что дескать отладкой кода клиента они не занимаются. Что, впринципе, и понятно. Мммдддяяя..
    Но попробовать можно, конечно попросить. За спрос в нос не дадут.
     
  10. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    Ну вот... Что и требовалось доказать... :(

    [18.05.2008 18:09:50]
    Q: Понимаю, что врядли получу положительный ответ, но всё же рискну спросить.
    Вы не могли бы перенастроить PHP интерпритатор как модуль к Апачам, а не как CGI ?
    Если это возможно - сделайте пожалуйста.
    Жду ответа.
    Спасибо.
    -------------------------------------------------------


    [18.05.2008 18:16:14]
    A: Добрый день.

    На виртуальном хостинге такое невозможно.

    Можем настроить вам php как модуль на выделенном сервере:
     
  11. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    Так что придётся переделать на сессии. :(
     
  12. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    А какие ещё есть простые варианты решения данной проблемы?
    ТО есть сделать аутентификацию не сложной. Понимаю, что чем проще , тем уязвимее.
     
  13. Mc X

    Mc X Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    24
    Симпатии:
    0
    Адрес:
    Северная и Культурная Столица России
    В сессиях ничего сложного и нету ;)

    Могу посоветовать...
    А.А.Орлов "PHP. Полезные приемы"
    (в инете много видел линков на электронную версию)
    там есть про них и все вполне доступно написано ;)
    + Manual PHP
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    oleg67
    http://phpfaq.ru/sessions - здесь - что такое сессии и как работают
    Тебе нужно: заменить все $_SERVER на $_SESSION (мож и названия ключей поменять), на странице входа тебе нужно вместо окошка базовой аутинтефикации сделать HTML-форму входа. Назвать поле для ввода имени - PHP_AUTH_USER и поле ввода пароля - PHP_AUTH_PW.
     
  15. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    Спасибо огромное за подсказку. ПРобовал так сделать. Вышло криво. Руки видать такие. :(
    Потом сделал проще - у хостера защитил папку с админкой с помощью .htaccess. Работает вроде бы нормально.
    Спасибо тебе огромное за помощь.
    А книжка эта у меня есть. Читал. Смотрел. ПРосто опыта мало. ВОт и бился, как рыба об лёд. :)
    Да ещё видать у хостера какие-то настройки PHP кривоватые.
    Кстати, прикол.. Я смотрел тот момент о котором говорил уважаемый Dagdamor:

    Всё работает в этом смысле. Переменные PHP_AUTH_PW и PHP_AUTH_USER нормально передаются в том коде что я приводил сначала. Только почему-то всё равно не работал тот код. :( Так и не въехал по какой причине.
    Возможно функция mysql_escape_string Как то не так работает на хосте? Вобщем фиг его поймёт.
    А проверил переменные так:
    PHP:
    1.  
    2. ......
    3. $a= var_dump($_SERVER['PHP_AUTH_PW']);
    4. $b= var_dump($_SERVER['PHP_AUTH_USER']);
    5. echo $a, $b;
    6. .......
    7.  
     
  16. oleg67

    oleg67 Активный пользователь

    С нами с:
    14 май 2008
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Харьков
    Блин. Рано похвастался... :(
    На главной странице админки - всё путём. А на некоторых почему-то отшибло вывод форм для редактирования содержимого. Ммммдддяяяя...
    Ё-моё! :(
    И почему бы это, интересно?
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    oleg67
    Понимаешь, не зная архитектуры админки, невозможно определить, в чем проблема. Попробуй включить ошибки - вверху каждого скрипта пропиши error_reporting(10);