【发布时间】:2011-07-26 11:09:10
【问题描述】:
这是跟进:
Allow users only certain information from database
我正在做这样的视图(我相信这可以优化):
db.php 包含在内:
$conn = mysql_connect("localhost","directory","dghgffhghf") or die(mysql_error());
mysql_select_db("directory", $conn) or die(mysql_error());
mysql_query("CREATE or REPLACE VIEW {$user}_rooms AS SELECT * FROM rooms WHERE palace = '$user'") or die(mysql_error());
mysql_query("CREATE or REPLACE VIEW {$user}_users AS SELECT * FROM users WHERE palace = '$user'") or die(mysql_error());
mysql_query("CREATE or REPLACE VIEW {$user}_servers AS SELECT * FROM servers WHERE palace = '$user'") or die(mysql_error());
mysql_query("CREATE or REPLACE VIEW {$user}_online_servers AS SELECT * FROM online_servers WHERE palace = '$user'") or die(mysql_error());
用户“目录”必须拥有SELECT、CREATE VIEW 和DROP 权限(DROP 是必需的,因为or REPLACE)。我不希望他们拥有 DROP 权限,因为目录用户将位于 apache 拥有的 PHP 文件中,并且他们不限于使用 dir - 所以他们可以查看用户并通过。
另外,我不希望用户只使用bob_rooms,而他实际上是joe。我只想为该特定连接上的该用户创建视图,并在连接消失后立即删除。我不能指望用户自己DROP查看。
另外,拥有一个可以自动删除的临时视图将消除or REPLACE 的使用,这意味着我可以为用户获取奇怪的DROP 权限。
我猜在 SQLlite 中它会很简单:
CREATE TEMP VIEW ...
SqlLite 可以做临时视图,但 MySQL 不能?
【问题讨论】:
-
为什么要删除它们?这不像它们是静态的或任何东西(尽管我怀疑以这种方式限制用户访问的计划的合理性,或者当他们不能被信任时授予编写自己的 SQL 查询的权利)。
-
因为如果视图没有丢弃它们,任何用户只要知道他们的用户名就可以查看其他用户的信息。这个想法是目录数据库包含有关其服务器的信息。有些信息是私密的。我允许他们访问自己的信息,以便他们可以使用这些信息向访问者显示信息。
-
跟现在有什么区别?他们仍然可以,只是时间少了..
-
我希望 mySQL 有一个临时视图,就像临时表一样,只有创建该表的连接才能访问该表。因此,当他们运行他们的 PHP 文件时,将为他们创建一个视图/表格,他们将无法访问其他任何内容。
-
临时视图的惊人之处在于视图可以允许读/写
标签: php mysql sql permissions views