一尘不染

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

sql

在回答“ use current_user()”(在许多情况下确实有效)或“ use 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';

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

上面的方法不起作用。它不起作用的原因是默认情况下current_user()返回视图的 定义器
,导致没有数据或(更糟糕的)错误数据,这取决于定义器是谁。如果要current_user()返回 调用 用户,则需要创建带有SQL SECURITY INVOKER子句的视图,这也将安全特权限制为调用用户的安全特权,从而破坏了代码的原始用途。

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

附带说明,以防万一:在这种情况下,用PHP(或Ruby,perl或其他任何东西)获取IP地址是没有用的。我正在设置一些数据库安全性,因此依赖客户端显然是不够的。我需要SQL中的IP地址。

对于好奇的想法/参考/上下文:

作为参考,我从这里获得了这个漂亮的安全窍门的想法,但是他们使用的是用户名而不是IP地址,这将使此操作变得更加容易。就我而言,我正在尝试建立一个主机数据库,该数据库从主机本身进行了部分更新。我不想为每个主机设置不同的用户,但是我希望每个主机都能够更新其自己的记录(文件系统,风扇速度,温度等)。


阅读 308

收藏
2021-05-30

共1个答案

一尘不染

我不愿回答一个问题。

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

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

2021-05-30