Db 在columns_priv和tables_priv表中,Db值必须是真正的数据库名(照字面上),不允许模式和空白。在db和host中,Db值可以以字面意义指定或使用SQL模式字符''''%''''或''''_''''指定一个通配符。一个''''%''''或空白匹配任何数据库。 Table_name,Column_name 这些列中的值必须是照字面意思的表或列名,不允许模式和空白。 某些范围列被服务器视为大小写敏感的,其余不是。这些原则总结在下表中。特别注意Table_name值总是被看作大小写敏感的,即使在查询中的表名的大小写敏感性对待视服务器运行的主机的文件系统而定(UNIX下是大小写敏感,而Windows不是)。
表3 授权表范围列的大小写敏感性 列 Host User Password Db Table_name Column_name 大小写敏感性 No Yes Yes Yes Yes No
创建一个有一个LONGBLOB列的表: USER test; CREATE TABLE tmp (b LONGBLOB);
使用该表读取每个对应于你想偷取的数据库表文件的内容,然后将表内容写入你自己数据库的一个文件中:
LOAD DATA INFILE "./other_db/x.frm" INTO TABLE tmp FIELDS ESCAPED BY "" LINES TERMINATED BY ""; SELECT * FROM tmp INTO OUTFILE "y.frm" FIELDS ESCAPED BY "" LINES TERMINATED BY ""; DELETE FROM tmp; LOAD DATA INFILE "./other_db/x.ISD" INTO TABLE tmp FIELDS ESCAPED BY "" LINES TERMINATED BY ""; SELECT * FROM tmp INTO OUTFILE "y.ISD" FIELDS ESCAPED BY "" LINES TERMINATED BY ""; DELETE FROM tmp; LOAD DATA INFILE "./other_db/x.ISM" INTO TABLE tmp FIELDS ESCAPED BY "" LINES TERMINATED BY ""; SELECT * FROM tmp INTO OUTFILE "y.ISM" 现在你拥有了一个新表y,它包含other_db.x的内容并且你有全权访问它。 为避免让人以同样的方式攻击,根据“1 内部安全性-保护你的数据目录”中的指令设置你的数据目录上的权限。你也可以在你启动服务器时使用--skip-show-database选项限制用户对于他们没用访问权限的数据库使用SHOW DATABASES和SHOW TABLES。这有助于防止用户找到关于它们不能访问的数据库和表的信息。
GRANT ALL ON *.* TO anyname@localhost IDENTIFIED BY "passwd" WITH GRANT OPTION 该语句将在user表中为anyname@localhost创建一个记录,打开所有权限,因为这里是超级用户(全局)权限存储的地方,要用INSERT语句做同样的事情,语句是:
INSERT INTO user VALUES("localhost","anyname",PASSWORD("passwd"), "Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y") 你可能发现它不工作,这要看你的MySQL版本。授权表的结构已经改变而且你在你的user表可能没有14个权限列。用SHOW COLUMNS找出你的授权表包含的每个权限列,相应地调整你的INSERT语句。 下列GRANT语句也创建一个拥有超级用户身份的用户,但是只有一个单个的权限:
GRANT RELOAD ON *.* TO flush@localhost IDENTIFIED BY "flushpass" 本例的INSERT语句比前一个简单,它很容易列出列名并只指定一个权限列。所有其它列将设置为缺省的"N":
INSERT INTO user (Host,Password,Reload) VALUES("localhost","flush",PASSWORD("flushpass"),"Y") 数据库级权限用一个ON db_name.*子句而不是ON *.*进行授权:
GRANT ALL ON sample.* TO boris@localhost IDENTIFIED BY "ruby" 这些权限不是全局的,所以它们不存储在user表中,我们仍然需要在user表中创建一条记录(使得用户能连接),但我们也需要创建一个db表记录记录数据库集权限:
INSERT INTO user (Host,User,Password) VALUES("localhost","boris",PASSWORD("ruby"))
INSERT INTO db VALUES("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y","Y")
"N"列是为GRANT权限;对末尾的一个数据库级具有WITH GRANT OPTION的GRANT语句,你要设置该列为"Y"。