MYSQL如何限制用户访问information_schema?

16

我有一个MySQL服务器(服务器版本:5.1.68-community;MySQL客户端版本:5.0.51a)。是否有任何方法可以限制所有用户对information_schema的访问?

现在的情况是,一些客户网站经常遭受SQL注入攻击,并且攻击者可以从information_schema表/视图中获取数据库结构。当然,我们需要更改PHP代码以防止SQL注入,但仍然希望在整个服务器范围内限制对information_schema的访问。

请指导我...提前致谢。

2个回答

33

INFORMATION_SCHEMA是一个虚拟数据库,它保存当前用户可以访问的所有数据库的元信息。也就是说,它根据用户的权限动态构建。它不是真正的数据库。您不应尝试在任何情况下更改对其的权限——它会根据服务器状态动态更新。

因此,您的问题有点没有意义。如果某个人通过某个用户攻击系统并获得了系统控制权和该用户的权限,这个人将能够按定义访问该用户的INFORMATION_SCHEMA(因为该用户可以访问其权限允许的任何东西——INFORMATION_SCHEMA是用户权限的"投影")。


2
非常感谢您的快速回复。我的问题不在于有人篡改了其他用户,而是关于SQL注入。任何人都可以像“....%20union%20select%201,group_concat(table_name),3%20%20from%20information_schema.tables%20where%20table_schema=database()”(从实际攻击中获取)这样注入一个SQL语句到PHP代码中,并获得当前数据库的结构。我完全理解必须修复PHP代码中的漏洞,但如果我们可以限制所有用户对信息架构的SELECT权限(至少),将会更安全。 - Sujith
3
请注意:如果 SQL 注入攻击成功,那么就没有办法阻止用户使用其自身的权限。INFORMATION_SCHEMA 仅是一个投影。如果用户已经可以访问某些表 - 即使没有访问该数据库,他也会这样做。在您的情况下,他只需使用 SHOW TABLES 即可。 - Alma Do
1
您说得完全正确,我非常同意您的观点。至于样例注入攻击,攻击者可以通过此方法获取表格清单,然后进行另一次注入操作来获取数据,并且针对这些表格进行添加/编辑/删除操作,我们会遇到麻烦。 - Sujith

-4

目前还无法防止访问information_schema,但在通过GET请求进行SQL注入的情况下,很容易执行以下操作:

RewriteCond %{REQUEST_FILENAME}   !handle_error\.php
RewriteCond %{QUERY_STRING}   information_schema
RewriteRule  ^(.*?)          /handle_error.php [R=301,L]

在你的.htaccess文件中添加这行代码,能够有效地帮助你避免一些麻烦。

如果我不想打开一个链接,我只需要在链接中添加“information_schema”。例如:我在你的网站上使用“information_schema”作为我的昵称,任何包含我的昵称的链接都将被阻止。同样的道理也适用于我放置的链接。但是这种方法对POST请求没有保护作用。 - Xenos
这是网站开发人员的选择,你的使用情况可能从未遇到过,在查询字符串中显示昵称并不是必要的。否则,你是完全正确的,我不能不同意。 - devplayer

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