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

4
在你回答“使用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这样的操作,然后得到适用于我的testtable的正确的子集。但是上述方法不起作用。原因在于current_user()默认返回视图的定义者,导致没有数据或(更糟糕的是)错误的数据,具体取决于定义者是谁。如果我想要current_user()返回调用用户,我需要使用SQL SECURITY INVOKER子句创建视图,这也限制了安全权限仅适用于调用用户,从而打败了代码的原始目的。我很想使用user() ,但不幸的是,它几乎总是返回主机名/域,而不是IP地址。顺便说一下,如果还不清楚的话:在PHP(或Ruby、perl或其他语言)中获取IP地址在这种情况下并不有用。我正在设置一些数据库安全性,所以仅依赖客户端显然是不够的。我需要在SQL中使用IP地址。对于那些寻找想法/参考/背景的人:可以参考这里获得有关此巧妙安全技巧的灵感,但是他们使用用户名而不是IP地址,这会使此方法更加容易。在我的情况下,我正在尝试设置一个主机数据库,它部分地由主机自身更新。我不想为每个主机设置不同的用户,但我确实希望每个主机能够更新自己的记录(例如文件系统、风扇速度、温度等)。

1
为什么有人会对这个问题点踩?它写得很好,并且很明显作者已经做了充分的研究。 - dfb
1
“show processlist” 命令将列出用户/IP 相关信息,但似乎没有办法按特定用户进行过滤。我认为没有其他函数/查询会返回此数据。 - Marc B
2
请查看这个答案 - Maxim Krizhanovsky
2
可能是重复的问题:在MySQL中检索客户端IP地址 - Maxim Krizhanovsky
@Darhazer:那个解决方案在不改变mysqld调用的情况下无法工作(我可能最终会这样做,但我想要一个适用于一般情况的解决方案)。information_schema.processlist默认给出主机名而不是IP地址。 - Rick Koshi
2个回答

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

这正是我要说的话。 - Marcus Adams
1
好的,知道这些非常好。但是如果我无法控制mysqld进程,或者我想在我的授权表中使用主机名(例如为其他不相关的用户),该怎么办? - Rick Koshi

0

我不喜欢留下问题未解决...

看起来没有办法在不全局修改mysqld行为(通过完全禁用名称解析)的情况下完成此操作,这显然会对其他领域产生影响。

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


1
你可以使用任何身份验证方式通过SSL / TLS连接到MySQL...因此,SSH的这些“优点”并不真实;我还建议,虽然这种解决方法可能适合您的需求,但它并没有真正回答问题(如何确定MySQL客户端IP-在本例中,它应该发现SSH服务器的地址)。 - eggyal
@eggyal:你的所有观点都是正确的。不幸的是,似乎没有真正的答案来回答原始问题。换句话说,按照所述,它无法完成。我认为发布一个解决方法总比什么都不做要好。 SSH解决方法的主要优点是它可以工作。;-) - Rick Koshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接