Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Логирование в процессе авторизации
Форумы портала PHP.SU » Разное » Прочее » Логирование в процессе авторизации

Страниц (1): [1]
 

1. improbable - 22 Сентября, 2013 - 18:32:57 - перейти к сообщению
Для себя сделал класс для записи в лог при авторизации пользователя.

PHP:
скопировать код в буфер обмена
  1. class log
  2. {
  3.   private $log;
  4.   function __construct($filename, $mode = 'a+')
  5.   {
  6.     $this->log = @fopen($filename, $mode);
  7.   }
  8.   function __destruct()
  9.   {
  10.     @fclose($this->log);
  11.   }
  12.   private function write_to_log($message)
  13.   {
  14.     $count_result = count($message);
  15.     for($i = 0; $i < $count_result; $i++)
  16.     {
  17.       $message[$i] = filter($message[$i]);
  18.     }
  19.     unset($count_result, $i);
  20.  
  21.     $message = implode('|', $message);
  22.     @fwrite($this->log, filter($message, 200, false) . "\n");
  23.   }
  24.   public function new_failure($username, $captcha)
  25.   {
  26.     $message = [0, date('r'), $username, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT'], $captcha[0], $captcha[1]];
  27.     $this->write_to_log($message);
  28.   }
  29.   public function new_success($username, $captcha)
  30.   {
  31.     $message = [1, date('r'), $username, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT'], $captcha[0], $captcha[1]];
  32.     $this->write_to_log($message);
  33.   }
  34.   public function new_other()
  35.   {
  36.     $message = [2, date('r'), $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']];
  37.     $this->write_to_log($message);
  38.   }
  39. }


Прилагаемая функция filter:

PHP:
скопировать код в буфер обмена
  1. function filter($data, $max_length = 100, $replace_vb = true)
  2. {
  3.         $data = trim($data);
  4.         $data = strip_tags($data);
  5.         $data = htmlspecialchars($data, ENT_QUOTES);
  6.         if($replace_vb)
  7.         {
  8.                 $data = str_replace('|', '_', $data);
  9.         }
  10.         if(strlen($data) > $max_length)
  11.         {
  12.                 $data = substr($data, $max_length);
  13.         }
  14.         unset($max_length, $replace_vb);
  15.         return $data;
  16. }
2. esterio - 22 Сентября, 2013 - 18:43:46 - перейти к сообщению
сплошной говнокод Радость Радость
3. improbable - 22 Сентября, 2013 - 18:46:07 - перейти к сообщению
esterio пишет:
сплошной говнокод Радость Радость

вроде всё нормально)
4. EuGen - 22 Сентября, 2013 - 19:28:50 - перейти к сообщению
improbable пишет:
function __construct($filename, $mode = 'a+')
{
$this->log = @fopen($filename, $mode);
}

А если не удалось?
improbable пишет:
for($i = 0; $i < $count_result; $i++)
{
$message[$i] = filter($message[$i]);
}

Что есть "filter" в контексте класса, почему она идёт отдельно от него? (Нарушает принцип инкапсуляции, так как пользователь не обязан знать, что происходит внутри и зачем нужна дополнительная функция)
improbable пишет:
$message = implode('|', $message);
@fwrite($this->log, filter($message, 200, false) . "\n");

А если не удалось?
improbable пишет:
unset($count_result, $i);

Смысл этого действия в локальном контексте метода без прямого вызова gc_collect_cycles ?

Перемещено в "Прочее"
5. esterio - 23 Сентября, 2013 - 12:08:07 - перейти к сообщению
improbable пишет:
вроде всё нормально)

1. подавления ошыбок вместо их обработкы
2. отсутсвие инкапсуляции
3. функция filter ужас для програмистов
3.1. strip_tags - удалит тегы, htmlspecialchars - преобразует кавички. - зачем если я логировать хочу, я должен все видеть
3.2. поверте сберщик мусора умнее Вас. так что не нужно unset($max_length, $replace_vb);
4. $_SERVER['REMOTE_ADDR'] - не всегда верный адресс (читать прокси)

Возьмите учебник поновее, много кода из старых уроков
6. Мелкий - 23 Сентября, 2013 - 12:32:48 - перейти к сообщению
esterio пишет:
4. $_SERVER['REMOTE_ADDR'] - не всегда верный адресс (читать прокси)

Всегда верный адрес. Это именно тот адрес, с которого пришёл запрос.
7. EuGen - 23 Сентября, 2013 - 12:38:38 - перейти к сообщению
Мелкий пишет:
Всегда верный адрес. Это именно тот адрес, с которого пришёл запрос.

Всё-таки, не всегда. Но безотносительно прокси (который не имеет отношения к вопросу), он может быть неверным только из-за конфигурации веб-сервера (единственный мне известный случай - 127.0.0.1 на любой запрос в IIS в ряде случаев)
8. esterio - 23 Сентября, 2013 - 13:39:06 - перейти к сообщению
1. когда на фронте Nginx а на бекенде апач без модуля mod_rpaf
2. при использовании прокси в $_SERVER['REMOTE_ADDR'] будет ИП самого прокси, а ИП пользователя будет в HTTP_X_FORWARDED_FOR
9. Мелкий - 23 Сентября, 2013 - 14:02:49 - перейти к сообщению
esterio пишет:
при использовании прокси в $_SERVER['REMOTE_ADDR'] будет ИП самого прокси, а ИП пользователя будет в HTTP_X_FORWARDED_FOR

Вот именно IP прокси и надо логировать. И, при наличии и желании - весь X_FORWARDED_FOR. А то и весь $_SERVER.

Остальные два случая - всё-таки ошибка конфигурирования. Когда должна исправляться конфигурированием.
10. Squirrel - 23 Сентября, 2013 - 15:08:33 - перейти к сообщению
Мелкий пишет:
Всегда верный адрес. Это именно тот адрес, с которого пришёл запрос.
Вопрос чисто в семантике. Все зависит, от того, что именно понимать под "верный адрес". По этому и утверждения "всегда верный" и "чаще всего не верный" одинаково верны.

Мелкий пишет:
X_FORWARDED_FOR.

Не каждый прокси его выдаст. Любой HIA прокси его точно не выдаст.

В случае описанном esterio REMOTE_ADDR вообще не имеет никакой ценности. А вот X_FORWARDED_FOR как раз и представляет интерес.

 

Powered by ExBB FM 1.0 RC1