我如何才能找到当前用户在MySQL连接的IP地址?(How can I find the IP ad

2019-09-17 02:56发布

在你回答“使用CURRENT_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中的IP地址(或Ruby或Perl,或其他)是不是在这种情况下非常有用。 我设置了一下数据库的安全性,所以依赖于客户端明显不足。 我需要在SQL的IP地址。

对于好奇寻找创意/参考/背景:

作为参考,我从这个漂亮的安全技巧的想法在这里 ,但他们使用的用户名,而不是IP地址,这将使这更简单。 就我而言,我试图建立它的主机部分由主机本身更新的数据库。 我不想设置每个主机的不同的用户,但我希望每个主机能够更新其自己的记录(文件系统,风扇转速,温度等)。

Answer 1:

如果你有过控制mysqld过程中,你可以与启动它--skip-name-resolve选项; 然后SUBSTRING_INDEX(USER(), '@', -1)会给你当前用户的IP地址。



Answer 2:

我不想离开一个无法解决的问题...

看来,有没有办法做到这一点没有改变全球的mysqld的行为(通过完全禁用名称解析),这显然在其他方面的后果。

幸运的是,不同的选项是创建一个“存根”程序,通过SSH访问,其从客户端接收数据时,检查IP地址,并传递到数据库(可能改性的)数据。 当然,这种使用SSH验证而不是数据库的帐户,并介绍了另一层复杂性。 它还要求你必须能够作为穿针引线作用的服务器外壳级别的访问。 从积极的一面,它可以说是提供更好的安全(加密过线和卓越的认证)如果短线正确实施。



文章来源: How can I find the IP address of the current user's connection in MySQL?