Mysql入门系列:安全网络访问mysql数据库服务器
2006-12-31 10:52:34 来源:WEB开发网在逻辑条件下,授权表由服务器按以下形式使用:
user OR db OR tables_priv OR columns_priv
您可能正在奇怪,为什么上面的描述只涉及到五个授权表中的四个。正击中要害,服务器实际检查访问许可权的方法如下:
user OR (db AND host) OR tables_priv OR columns_priv
笔者先给出了较简单的表达式,因为host 表不受GRANT 或REVOKE 语句的影响。如果一直保持使用GRANT 和REVOKE 来管理用户权限,将不需要考虑host 表。但下面还是给出了对该表的讨论,以便您有所了解:
当服务器检查数据库级的权限时,它查看客户机的db 表的项。如果Host 列值是空白,其含义是“检查host 表查找哪些服务器可访问该数据库”。
服务器利用与来自db 表项相同的Db 列为项查看host 表。如果host 表项与客户机主机不相配,就不授予数据库级权限。如果这些项都与客户机正在连接的主机的Host 列值相配,则db 表的项和host 表的项进行组合以产生客户机的数据库级权限。
但是,权限用逻辑AND 进行组合,其意思是,除非客户机同时出现在两个项中,否则它没有指定的权限。这样,可以在此db 表项中授予一组基本的权限,然后用host表项有选择地对特定的主机禁止使用这些权限。例如,允许从域的所有主机中访问某个数据库,但是对于定位在非安全范围内的主机禁止使用数据库权限。
以上描述无疑要进行访问检查,这听起来好像是相当复杂的过程,尤其是考虑到服务器要为客户机发布的每一个单独的查询检查权限时。但是,该过程相当地快,因为服务器不对每个查询实际检查授权表的信息。相反,在服务器启动时,它将该表的内容读到内存中,然
后用内存中(i n - m e m o r y)的拷贝来检验查询。这对于访问检查操作性能产生了推进,但有相当重要的负面效应:如果您直接修改了授权表的内容,则服务器将不会注意到权限的改变。
更多精彩
赞助商链接