MySQL: DEFINER对存储过程和函数有什么影响?

5

我使用SQLyog在正在开发的远程MySQL数据库中编写存储过程和函数。该数据库只有一个用户名/密码,它通过我用Delphi编写的前端可执行应用程序访问。数十个不同的人都使用相同的用户名。

当我使用SQLYog编写存储过程时,例如,

CREATE PROCEDURE age_frequency_count(IN bin_size INT)

生成的过程会将定义者放入其中,无论我是否喜欢,这将导致...
CREATE DEFINER=<the_user_name>@<my_IP_address> PROCEDURE age_frequency_count(IN bin_size INT)

我认为这是由MySQL而不是SQLYog DBMS完成的。(我认为这是由MySQL而不是SQLYog DBMS完成的。)
从文档和Stack Overflow上的帖子中了解到,definer用于指定执行或更改过程所需的权限以及允许过程执行什么操作,但我还是有些困惑,希望能得到澄清。
问题:
如果我的IP地址在定义者中,其他人是否仍然可以从不同的IP地址登录并执行该过程(尽管使用相同的用户名)?
请问有谁能够澄清一下定义者的作用?也就是说,连接到我的IP地址可以做什么,而其他IP地址的连接则不能?
1个回答

5
我使用DEFINER子句创建一个存储过程,该存储过程具有强大用户的安全权限,该用户还具有对特定数据库表的UPDATEDELETESELECTINSERT权限。然后,我只授予minon用户(有些人称之为www用户,而不是更强大的wwwproxy用户)对该存储过程的EXECUTE权限。
这样,minion只能执行指定的存储过程,并且在数据库表上没有UPDATEDELETESELECTINSERT或其他权限。
希望这有助于理解DEFINER子句背后的思想。使用它来区分powertasks
你是正确的,默认情况下,MySQL在创建存储过程时使用当前用户的身份作为DEFINER。这个身份可以是前端应用程序的身份,或者像我说的那样,你可以使用一个具有普通表权限的proxy user。然后,应用程序用户将成为只有一个存储过程权限EXECUTEminion
简而言之,如果默认的DEFINER用户不代表前端应用程序用于登录到数据库的内容,并且你希望它这样做,那么你需要使用ALTER更改存储过程(如果可能)。
另一方面,更好的想法是使用minon/proxy场景。互联网上的应用程序用户与出现在存储过程DEFINER子句中的IP无关。重要的是你的应用程序从哪里登录到MySQL。你的应用程序正在与数据库通信,而不是人们计算机上的用户代理。然而,这个概念通常是最初混淆的点。你很好!
希望这能有所帮助。

你没有回答关于IP地址的问题。在定义者问题上,这个答案是完全正确的。 - Shadow
1
@Shadow 我的电脑崩溃了。抱歉! :-) - Anthony Rutledge
这个数据库只有一个用户,所以我的存储过程/函数只能执行该用户能够执行的操作。但是你是说一旦编写完成,任何使用我的存储过程/函数的人都可以执行该存储过程/函数所需的任何操作(因为我们实际上都是同一个用户)?那么定义者中的IP地址部分又如何呢?它会阻止其他IP地址的用户执行吗? - user3209752
操作顺序如下。来自互联网的访客联系您的应用程序/中间件(Delphi),然后使用您的应用程序的唯一MySQL用户帐户登录并执行存储过程。互联网访客不会获得明确的权限来执行任何操作,他们的IP地址也不是一个因素。通过正确的帐户、正确的IP和正确的密码登录,您的应用程序具有执行存储过程的特权。无论那个唯一的MySQL用户帐户能做什么,所有可以使用该帐户登录的人都可以做到。 - Anthony Rutledge
1
因此,请注意SQL注入,因为如果那个单一的账户可以“DROP”表格并且您的应用程序容易受攻击,那么您可能会陷入困境。这就是为什么两个账户系统更好的原因。 :-) - Anthony Rutledge
显示剩余3条评论

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