1 MySQL权限管理
.1.1 权限系统的工作原理
SHOW GRANTS FOR 'username' @'localhost' ;
解释:这条SQL语句用于查看指定用户在本地主机上的权限。其中username
是要查看权限的用户。 .1.2 权限表的存取
SELECT user , host, password, Select_priv, Insert_priv FROM mysql. user ;
解释:这条SQL语句从mysql.user
表中查询用户、主机、密码以及选择和插入权限信息。mysql.user
表存储了用户的权限相关信息。
2 账号管理
CREATE USER 'new_user' @'localhost' IDENTIFIED BY 'password' ;
解释:这条语句创建了一个名为new_user
的用户,该用户只能从本地主机(localhost
)登录,密码为password
。 修改用户密码
SET PASSWORD FOR 'user' @'localhost' = PASSWORD( 'new_password' ) ;
3 MySQL安全问题
3.1 操作系统相关的安全问题
确保MySQL数据目录的安全 在Linux系统中,使用命令行设置权限 chown -R mysql:mysql /var/lib/mysql
chmod -R 700 /var/lib/mysql
解释:第一条命令将/var/lib/mysql
目录及其内容的所有者和所属组设置为mysql
,第二条命令将权限设置为只有所有者有读、写和执行权限,防止其他用户访问数据目录。 ** 数据库相关的安全问题**
防止SQL注入(以简单的PHP和MySQL为例) 在PHP中使用预处理语句 <?php
$mysqli = new mysqli ( "localhost" , "user" , "password" , "database" ) ;
$stmt = $mysqli -> prepare ( "SELECT * FROM users WHERE username =? AND password =?" ) ;
$username = "user_input_username" ;
$password = "user_input_password" ;
$stmt -> bind_param ( "ss" , $username , $password ) ;
$stmt -> execute ( ) ;
$result = $stmt -> get_result ( ) ;
while ( $row = $result -> fetch_assoc ( ) ) {
}
$stmt -> close ( ) ;
$mysqli -> close ( ) ;
解释:在PHP中,使用mysqli
的预处理语句可以防止SQL注入。bind_param
方法将用户输入作为参数绑定,而不是直接嵌入到SQL语句中。
其他安全设置选项
1 old - passwords
设置old - passwords
选项(在配置文件中) [mysqld]
old - passwords=1
解释:在my.cnf
或my.ini
配置文件的[mysqld]
节中设置old - passwords
选项。这可能会影响用户密码的存储方式。 2 safe - user - create
在配置文件中启用safe - user - create
[mysqld]
safe - user - create = 1
解释:在MySQL配置文件中设置safe - user - create
选项为1
,这有助于防止非管理员用户创建新用户。 3 secure - auth
[mysqld]
secure - auth = 1
解释:设置secure - auth
选项为1
可以增强用户认证的安全性,防止弱认证方式。 4 skip - grant - tables
在配置文件中使用skip - grant - tables
(仅用于紧急情况或测试) [mysqld]
skip - grant - tables
解释:在my.cnf
或my.ini
配置文件的[mysqld]
节中设置skip - grant - tables
选项。这将使MySQL启动时跳过权限表检查,但这在生产环境中是非常危险的,除非在紧急恢复或测试场景下。 5 skip - network
在配置文件中启用skip - network
(限制MySQL只在本地访问) [mysqld]
skip - network
解释:设置skip - network
选项可以禁止MySQL接受网络连接,只允许本地访问,从而增强安全性。 6 skip - show - database
在配置文件中启用skip - show - database
[mysqld]
skip - show - database = 1
解释:设置skip - show - database
选项为1
可以防止非管理员用户查看数据库列表。