如何在MySQL中找到当前用户连接的IP地址?

时间:2012-05-09 19:36:45

标签: mysql sql ip ip-address

在你回答“使用current_user()”之前,它确实适用于很多情况,或者“使用user()”,这真的不起作用,请阅读以下内容......

我正在尝试在表上创建一个视图,该视图限制用户对表中某些行的访问,由用户连接的IP地址控制。

我的第一次尝试看起来像这样:

create table testtable (
  `RowID` bigint not null auto_increment,
  `owner` varchar(64),
  `key` varchar(64),
  `val` varchar(64),
  primary key (`RowID`)
);
create view testview (
  `RowID`,
  `owner`,
  `key`,
  `val`
) as select
  `testtable`.`RowID` as `RowID`,
  `testtable`.`owner` as `owner`,
  `testtable`.`key` as `key`,
  `testtable`.`val` as `val`
from testtable
where (testtable.owner = substring_index(current_user(), '@', -1));

create user 'testuser'@'192.168.3.30' identified by 'testpass';
grant select, insert, update, delete on testview to 'testuser'@'192.168.3.30';

现在的理论是我应该能够从主机192.168.3.30以testuser身份登录并执行select * from testview之类的操作,并获得适用于我的测试表的适当子集。

以上不起作用。它不起作用的原因是current_user()默认返回视图的 definer ,导致没有数据,或者(更糟)错误的数据,这取决于定义者是谁。如果我希望current_user()返回调用用户,我需要使用SQL SECURITY INVOKER子句创建视图,这也限制了调用用户的安全权限,因此打败了代码的最初目的。

我很想使用user(),但不幸的是,几乎总是返回主机名/域而不是IP地址。

旁注,如果不清楚:在这种情况下,用PHP(或Ruby,或perl或其他)获取IP地址是没有用的。我正在建立一些数据库安全性,所以依赖客户端显然是不够的。我需要SQL中的IP地址。

对于好奇的寻找想法/参考/背景:

作为参考,我从here得到了这个漂亮的安全技巧的想法,但他们使用的是用户名而不是IP地址,这将使这更容易。在我的情况下,我正在尝试建立一个主机数据库,该主机数据库是从主机本身部分更新的。我不想为每个主机设置不同的用户,但我确实希望每个主机能够更新自己的记录(文件系统,风扇速度,温度等)。

2 个答案:

答案 0 :(得分:3)

如果您可以控制mysqld进程,则可以使用--skip-name-resolve选项启动它;然后SUBSTRING_INDEX(USER(), '@', -1)将为您提供当前用户的IP地址。

答案 1 :(得分:0)

我讨厌留下未回答的问题......

如果没有全局修改mysqld的行为(通过完全禁用名称解析),似乎没有办法做到这一点,这显然会在其他方面产生影响。

幸运的是,另一种选择是创建一个“存根”程序,通过SSH访问,该程序接受来自客户端的数据,检查IP地址,并将(可能已修改的)数据传递给数据库。当然,这使用SSH验证而不是数据库帐户,并引入了另一层复杂性。它还要求您具有对服务器的shell级访问权限,该服务器可以充当中间人。从好的方面来说,如果存根被正确实现,它确实可以提供更好的安全性(线路加密和高级认证)。