Znajdź adres IP użytkownika, biorąc pod uwagę jego identyfikator UID?

8

Prowadzę stronę internetową Drupal 7 z rosyjską grą wieloosobową i co 4-5 dni muszę blokować bardzo irytujących graczy.

Przed Drupalem korzystałem z phpBB 3. Gdy osoby te będą pochodzić z małego miasta / wioski, po prostu dodam ich sieć IP do reguł zapory, aby nie mogły się ponownie zarejestrować przy użyciu nowego adresu e-mail. W moim przypadku działało to dobrze i moje pytanie nie dotyczy tej polityki.

Mój problem polega na tym, że w Drupal nie mogę znaleźć ostatniego adresu IP używanego przez identyfikator użytkownika. Tzn. Sprawca jest zgłaszany mi przez innych użytkowników i znam jego identyfikator użytkownika, ale nie mogę znaleźć jego adresu IP w dziennikach, ponieważ:

  1. Włączyłem rejestrowanie syslog i widzę wiadomości Drupal w / var / log / messagess, ale rzadko pojawia się komunikat o logowaniu użytkownika, prawdopodobnie dlatego, że sesje są domyślnie długie i chciałbym zachować to w ten sposób przez komfort użytkownika.

  2. Włączyłem także „rejestrowanie bazy danych”, ale nie wiem, gdzie to zobaczyć (która tabela bazy danych).

Alexander Farber
źródło

Odpowiedzi:

9

Jeśli masz włączony moduł statystyk, tabela „dziennik dostępu” zawiera adresy IP wszystkich użytkowników.

SELECT hostname FROM accesslog WHERE uid = %UID_FOR_YOUR_USER% LIMIT 1

Jeśli nie masz włączonych statystyk, radzę ci je pominąć, nawet dla tego wyniku, ponieważ włączenie go powoduje poważną utratę wydajności.

W takim przypadku możesz użyć sessionstabeli:

SELECT hostname FROM sessions WHERE uid = %UID_FOR_YOUR_USER% LIMIT 1

Zaletą pierwszego nad drugim jest to, że pierwszy zawsze pokazuje najnowszą nazwę hosta, podczas gdy ten drugi nie zawsze jest aktualny.

berkes
źródło
To prawda, że ​​tabela sesji ma również adresy IP. Po prostu nie mogę też znaleźć tam niektórych użytkowników. Może to jakoś moja wina. Przyjmuję twoją odpowiedź i wyłączam moduły syslog i statystyki bazy danych, ponieważ nie były one dla mnie bardzo przydatne.
Alexander Farber
Użytkownicy, którzy nie byli zalogowani przez jakiś czas, nie będą mieli sesji i nie zostaną znalezieni. Jak powiedziałem „ten drugi nie zawsze będzie aktualny”, co oznacza: może nie mieć wszystkich użytkowników.
berkes
5

O ile mi wiadomo, Drupal nie zgłasza adresu IP używanego przez użytkowników w ich profilu użytkownika. Możesz utworzyć niestandardowy moduł, zweryfikować adres IP używany przez użytkownika i zapisać go we własnej tabeli bazy danych; następnie możesz pokazać to w profilu użytkownika użytkownikom, którzy mają odpowiednie uprawnienia (na przykład użytkownikom z uprawnieniami do administrowania użytkownikami).

Potrzebna jest funkcja ip_address () , której można użyć w implementacji hook_user_login () . Implementując hook_user_view () , możesz następnie pokazać takie informacje użytkownikom z odpowiednim uprawnieniem.

kiamlaluno
źródło
Dziękuję, ale wtedy będę miał ten sam problem, co teraz: użytkownicy rzadko się logują, co widzę w syslog. Funkcja hook_user_login () jest wywoływana tylko wtedy, gdy użytkownik loguje się (wprowadza swoje hasło).
Alexander Farber
Możesz zmusić ich do zalogowania się; jeśli opróżnisz tabelę sesji, użytkownicy powinni się ponownie zalogować.
kiamlaluno
3

Jeśli korzystasz z modułu rejestrowania bazy danych, Drupal przechowuje te informacje w tabeli nadzoru pod hostnamekolumną. Możesz albo napisać niestandardowe zapytania, aby uzyskać te informacje, albo użyć modułu Views Watchdog (obecnie tylko wersja deweloperska dla wersji 7.x, więc nie jestem pewien, jak dobrze działa w Drupal 7), aby udostępnić tę tabelę widokom.

jhedstrom
źródło
Nie, tabela kontrolna ma niestety taki sam problem jak moduł podstawowy syslog: dla niektórych użytkowników nie mam adresu IP, ponieważ zalogowali się dawno temu. Dostaję więc raport o złośliwym użytkowniku, próbuję znaleźć jego adres IP, aby dodać go do moich reguł usuwania zapory, ale nigdzie nie mogę znaleźć jego adresu IP.
Alexander Farber
Domyślnym ustawieniem watchdoga jest niestety zachowanie tylko 1000 wiadomości. W aktywnej witrynie może to trwać tylko godzinę lub krócej. W zależności od witryny możesz zwiększyć tę liczbę (admin / config / development / loging) lub alternatywnie zbudować niestandardowe rozwiązanie do przechowywania adresów IP zgodnie z opisem kiamlaluno.
jhedstrom
1

Pomogą w tym dwa ostatnie moduły:

Dziennik IP użytkownika , który ma integrację z widokami , oraz Menedżer adresów IP , który nie ma integracji z widokami, ale ma na celu integrację z Manifestem, Cave Your Trolls i Misery - wszystkie moduły związane z banowaniem.

Patrick Kenny
źródło
-1

session_id () daje bieżącemu użytkownikowi identyfikator sesji bez względu na to, czy jest on gościem czy członkiem.

$result = db_query("SELECT hostname FROM sessions WHERE sid = '".session_id()."'");
$data = db_fetch_object($result );
echo $data->hostname;
Vikas Naranje
źródło