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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Логирование в процессе авторизации

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
improbable
Отправлено: 22 Сентября, 2013 - 18:32:57
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




Для себя сделал класс для записи в лог при авторизации пользователя.

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. }

(Отредактировано автором: 22 Сентября, 2013 - 18:45:02)

 
 Top
esterio
Отправлено: 22 Сентября, 2013 - 18:43:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




сплошной говнокод Радость Радость
 
 Top
improbable
Отправлено: 22 Сентября, 2013 - 18:46:07
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




esterio пишет:
сплошной говнокод Радость Радость

вроде всё нормально)
 
 Top
EuGen Администратор
Отправлено: 22 Сентября, 2013 - 19:28:50
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




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 ?

Перемещено в "Прочее"


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
esterio
Отправлено: 23 Сентября, 2013 - 12:08:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




improbable пишет:
вроде всё нормально)

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

Возьмите учебник поновее, много кода из старых уроков
 
 Top
Мелкий Супермодератор
Отправлено: 23 Сентября, 2013 - 12:32:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




esterio пишет:
4. $_SERVER['REMOTE_ADDR'] - не всегда верный адресс (читать прокси)

Всегда верный адрес. Это именно тот адрес, с которого пришёл запрос.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 23 Сентября, 2013 - 12:38:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Мелкий пишет:
Всегда верный адрес. Это именно тот адрес, с которого пришёл запрос.

Всё-таки, не всегда. Но безотносительно прокси (который не имеет отношения к вопросу), он может быть неверным только из-за конфигурации веб-сервера (единственный мне известный случай - 127.0.0.1 на любой запрос в IIS в ряде случаев)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
esterio
Отправлено: 23 Сентября, 2013 - 13:39:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




1. когда на фронте Nginx а на бекенде апач без модуля mod_rpaf
2. при использовании прокси в $_SERVER['REMOTE_ADDR'] будет ИП самого прокси, а ИП пользователя будет в HTTP_X_FORWARDED_FOR
 
 Top
Мелкий Супермодератор
Отправлено: 23 Сентября, 2013 - 14:02:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




esterio пишет:
при использовании прокси в $_SERVER['REMOTE_ADDR'] будет ИП самого прокси, а ИП пользователя будет в HTTP_X_FORWARDED_FOR

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

Остальные два случая - всё-таки ошибка конфигурирования. Когда должна исправляться конфигурированием.


-----
PostgreSQL DBA
 
 Top
Squirrel
Отправлено: 23 Сентября, 2013 - 15:08:33
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


Помог: 4 раз(а)

[+]


Мелкий пишет:
Всегда верный адрес. Это именно тот адрес, с которого пришёл запрос.
Вопрос чисто в семантике. Все зависит, от того, что именно понимать под "верный адрес". По этому и утверждения "всегда верный" и "чаще всего не верный" одинаково верны.

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

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

В случае описанном esterio REMOTE_ADDR вообще не имеет никакой ценности. А вот X_FORWARDED_FOR как раз и представляет интерес.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Прочее »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB