Задавайте вопросы, мы ответим
Вы не зашли.
Как в триггере, навешанном например на вставку в таблицу, получить информацию о пользователе, который эту вставку совершает(ip-адрес, параметры сессии...)?
Может кто даст ссылку на пример такого триггера, или на документацию.
Заранее спасибо!
Неактивен
Никак, так как MySQL эту информацию не хранит. Максимум, что вы можете это определить пользователя (имя и хост), который эту вставку совершает.
select user();
Неактивен
Хм... Если не ошибаюсь, в MySQL есть возможность использования "внешних" процедур, написанных на компилируемом языке?
Плюс, открытый исходный код... Где-то, вроде, был пример того как список стандартных функций дополняли (типа COUNT(), MAX() и т.д.).
Т.е., теоретически возможно сделать такую функцию, которая будет возвращать данные о пользователе?
Неактивен
Можно после создания соединения сохранить в пользовательских переменных необходимую информацию. А из триггера к ним обращаться.
Неактивен
Попробую объяснить другими словами
У Вас есть такая схема:
Компьютер пользователя — Веб-сервер — Сценарий — База данных.
Вы хотите в триггере в базе данных записать информацию, которая
доступна на уровне веб-сервера. Проблема в том, что веб-сервер
может передать эту информацию максимум сценарию, и никакими
средствами, если сценарий *явно* не передаст эту информацию базе,
она об этом не узнает. Даже если напишете стороннюю функцию.
Просто потому что веб-сервер не соединяется с базой напрямую.
Неактивен
Тогда так:
Есть приложение которое работает через веб-сервер с БД.
Может ли злоумышленник каким-либо образом послать запрос к БД в обход приложения?
На каком уровне можно поймать запрос, чтобы получить информацию о злоумышленнике?
Неактивен
Может, если знает имя пользователя и пароль.
Дополнительная степень защиты может быть достигнута, если Вы настроите сервер MySQL так, чтобы он устанавливал соединение только на localhost - тогда соединяться с ним смогут только те приложения, которые запущены на вашем сервере (соответственно, злоумышленник должен будет получить доступ к одному из них, что уже сложнее).
Неактивен
А что за запрос "select user();"?
Как получить имя пользователя и хост?
И вообще что и где читать на счёт взаимодействия веб-сервера и сервера БД?
Неактивен
А что за запрос "select user();"?
Как получить имя пользователя и хост?
Вот как раз этот запрос выполните - и получите
И вообще что и где читать на счёт взаимодействия веб-сервера и сервера БД?
Начните, например, с http://php.net/manual/en/function.mysql-connect.php
Неактивен
paulus написал:
Вы хотите в триггере в базе данных записать информацию, которая
доступна на уровне веб-сервера.
Изначально про web-сервер ничего не говорилось. "Сессия" возможно по-разному понимать.
Неактивен
Тем не менее, он там есть. Можно считать это проявлением телепатических
способностей
Неактивен
Снова вопрос: как на уровне веб-сервера отловить запрос идущий к серверу БД,
и получить информацию о пользователе, её отправившем?
То есть злоумышленник знает имя пользователя и пароль для доступа к схеме БД,
и пытается совершить какие-то действия с ней, а мы должны вычислить, например, его IP-адрес.
Неактивен
Никак, злоумышленник, имеющий доступ к БД, не пойдет через веб-сервер.
Если же он пойдет через вебсервер, то воспользуется, например, torом.
Неактивен
Ну если всё-таки предположить существование такого незадачливого "злоумышленника".
Меня интересует, если он тупо отправит запрос на веб-сервер, не используя никакого сокрытия собственного IP.
Интерес чисто исследовательский, ну вот нужно именно в такой ситуации (так поставлена задача) получить сведения об отправителе.
Есть ли при такой постановке возможность получения интересующей меня информации или нет?
Если да, то на каком уровне и как?
Неактивен
В таком случае смотрите в журнал обращений веб-сервера
Неактивен
Если я правильно понимаю:
1.сценарий, например php, который обращается к серверу БД, априори лежит на веб-сервере,
а с локальной машины приходит лишь запрос на его выполнение,
таким образом нет возможности в логах обращения к веб-серверу (например AccessLog в Apache)
получить информацию об sql-запросе, находящемся в сценарии.
Если так, то злоумышленник не может написать свой php-сценарий, а может лишь запостить запрос на запуск одного из лежащих на веб-сервере (если они там вообще есть), в таком случае есть возможность получить его ip из лога.
2.если злоумышленник, зная имя пользователя и пароль доступа к БД, посылает запрос,
например используя MySQL query browser, то получить его ip-адрес невозможно в принципе.
----------------------------------------------
Или всё-таки можно во втором случае сделать какой-нибудь слушатель порта, по которому идёт подключение к БД, и который может помочь в данной ситуации получить ip-адрес?
Неактивен
Можете сделать слушатель порта, можете включить полный лог запросов SQL, и
вылавливать оттуда негодяя. Но если Вас заботит безопасность — я бы всё-таки
закрыл порт MySQL снаружи, а не пытался найти IP взломщика по логам.
В банках камеры, конечно, висят, но основной упор обычно делают на большую
стальную дверь с замками
Неактивен
Ну мои вопросы носят чисто теоретический характер, и к реальной системе безопасности отношения не имеют.
Полный лог запросов SQL это где?
Получается есть возможность зафиксировать в одном логе и ip-адрес и текст sql-запроса?
Отредактированно art88 (04.05.2010 14:45:58)
Неактивен
Полный лог запросов — это в MySQL.
А чисто теоретически — можно сделать что угодно. И даже пропатчить MySQL,
чтобы он сам отличал валидные запросы от хакерских Только оно не стоит
своих затрат ресурсов, разумеется.
Неактивен
То есть можно в MySql настроить лог так чтобы туда попадал ip-адрес?
Или это чисто теоретически и очень сложно?
Или это так же как в apache директиву прописал и всё?
(с логом MySql я ещё не разбирался).
Неактивен
Можно, ключевое слово --log, поразбирайтесь.
Неактивен
Хорошо, спасибо большое!
Неактивен
Разбирался с журналами MySQL.
Поставил denwer, прописал в my.cnf в секции
[mysqld]
log = c:/logfile.
Поставил MySQL Query Browser, настроил подключение к БД.
Отправляю запрос на выборку:
SELECT * FROM `user`
В логе:
100504 21:48:52 8 Init DB mysql
8 Query SELECT @@SQL_MODE
8 Query SHOW FULL COLUMNS FROM `mysql`.`user`
8 Query SHOW CREATE TABLE `mysql`.`user`
8 Query SELECT * FROM `user`
Прочитал документацию:
http://www.php.ru/mysql/mysql-database- … #query-log
никаких дополнительных параметров настройки логирования там не нашёл.
Вопрос:
Ip-адреса нет в логе потому что он(лог) так настроен, или потому что и сервер БД и клиент, отправляющий запрос находятся на одной машине?
Неактивен
Хотя нет один ключик дополнительный нашел:
--log-long-format
расширенный формат вывода в лог.
Как прописать его в my.cnf, просто:
[mysqld]
log = c:/logfile
log-long-format
что ли?
Неактивен
Смотрите там, где идет соединение, а не там, где сам запрос.
log-long-format, вроде бы, включен по умолчанию.
Неактивен