根据用户的UID找出用户的IP地址?


8

我正在运行带有俄罗斯多人纸牌游戏的Drupal 7网站,并且每4-5天必须阻止一些非常烦人的玩家。

在Drupal之前,我使用的是phpBB3。当这些人来自一个小城市/村庄时,我只需将其IP网络添加到防火墙规则中,这样他们就无法使用新的邮件地址重新注册。就我而言,这很好,我的问题与这项政策无关。

我的问题是在Drupal中,我找不到用户ID使用的最后一个IP地址。也就是说,滥用者是由其他用户报告给我的,并且我知道他的uid,但是在日志中找不到他的IP地址,因为:

  1. 我启用了syslog-logging,并在/ var / log / messagess中看到了Drupal消息,但是很少有关于用户登录的消息,这可能是因为默认情况下会话很长,并且我想保留这种方式用户舒适度。

  2. 我还启用了“数据库日志记录”,但是不知道在哪里可以看到它(哪个数据库表)。

Answers:


9

如果启用了统计模块,则“ accesslog”表将包含所有访问者的IP。

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

如果您没有启用统计信息,即使是这种结果,我也建议您将其保留,因为启用它会导致严重的性能损失。

在这种情况下,您可以使用sessions表:

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

第一个主机比第一个主机的好处是,第一个主机将始终向您显示最新的主机名,而后者可能并不总是最新的。


是的,会话表也具有IP地址。我只是在那里也找不到一些用户。也许是我的错。我会接受您的回答并禁用syslog和数据库统计信息模块,因为它们对我而言没有太大用处。
亚历山大·法伯

一段时间未登录的用户将没有会话,因此找不到。正如我所说的,“后者将不会总是最新的”,这意味着:它可能没有所有用户。
berkes 2011年

5

据我所知,Drupal不会在用户个人资料中报告用户使用的IP。您可以创建一个自定义模块,验证用户使用的IP,并将其记录在您自己的数据库表中;那么您可以将其显示在用户个人资料中,以显示给具有正确权限的用户(例如,显示给具有管理用户权限的用户)。

您需要的功能是ip_address(),可以在实现hook_user_login()的过程中使用它。实现hook_user_view(),然后您可以将这些信息显示给具有正确权限的用户。


谢谢,但是那样我将遇到与现在相同的问题:用户很少登录,正如我在syslog中看到的那样。并且hook_user_login()仅在用户登录(输入密码)时调用。
亚历山大·法伯

您可以强迫他们登录;如果您清空会话表,则用户应再次登录。
kiamlaluno

3

如果您正在使用数据库日志记录模块,则Drupal将此信息存储在hostname列下的看门狗表中。您可以编写自定义查询以获取此信息,也可以使用Views Watchdog模块(目前仅适用于7.x的开发版本,因此我不确定它在Drupal 7中的运行情况如何)以将该表公开给Views。


不会,看门狗表不幸的是与syslog核心模块存在相同的问题:对于某些用户,我没有IP地址,因为他们已经登录很长时间了。因此,我得到了有关某个恶意用户的报告,尝试找到他的IP并将其添加到我的防火墙规则中,但是我在任何地方都找不到他的IP。
亚历山大·法伯

不幸的是,看门狗的默认设置是仅保留1000条消息。在活动站点上,此过程只能持续一个小时或更短的时间。根据您的站点,您可能希望增加该数字(admin / config / development / logging),或者按照kiamlaluno的描述构建自定义IP存储解决方案。
jhedstrom 2011年


-1

session_id()为您提供当前用户的session-id,无论他/她是访客还是会员。

$result = db_query("SELECT hostname FROM sessions WHERE sid = '".session_id()."'");
$data = db_fetch_object($result );
echo $data->hostname;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.