当前位置: 首页 > 科技观察

PHP安全:安全使用MySQL

时间:2023-03-15 16:20:38 科技观察

MySQL基础知识一。MySQL的不当使用往往会导致致命的安全问题。1、运行安全为防止攻击者通过MySQL漏洞获取更高权限,请勿使用系统root用户运行MySQL服务器。mysqld默认拒绝使用root运行。如果mysqld服务需要指定用户运行,则应使用普通非特权用户运行mysqld,并在Linux中为数据库创建一个独立的MySQL账户。该帐号仅用于管理和运行MySQL。在MySQL配置/etc/my.cnf文件中指定执行账户。vim/etc/my.cnf[mysqld]user=mysql这个配置可以让服务器以指定用户启动,无论是手动启动还是通过mysqld_safe或mysql.server启动,都可以保证MySQL的身份。也可以配置在启动参数上,加上用户参数。/usr/local/mysql/bin/mysqld_safe--user=mysql&MySQL默认安装在/usr/local/mysql,对应的默认数据库文件在/usr/local/mysql/var目录下。未经授权的用户访问后,数据库会被打包复制走,所以应该限制对该目录的访问。当mysqld运行时,它仅作为对数据库目录具有读取或写入权限的Linux用户运行。MySQL主目录只能由root用户访问。chown-Rroot/usr/local/mysql/database目录只允许MySQL用户访问。chown-Rmysql.mysql/usr/local/mysql/var2,密码安全默认安装的MySQL的root用户密码为空密码。为了安全起见,必须改为强密码,即至少8个字符,由字母、数字和符号组成的不规则密码。使用MySQL自带的mysqladmin命令修改root密码。mysqladmin-urootpassword"new-password"//使用mysqladmin修改密码,可以使用以下命令登录数据库修改密码。mysql>usemysqlmysql>updateusersetpassword=password('new-password')whereuser='root';mysql>flushprivileges;//强制刷新内存授权表,否则仍使用内存中缓存的密码3.账户安全系统默认管理MySQL用户名为root,一般情况下,数据库管理员不会对其进行修改,这在一定程度上方便了系统用户密码暴力破解的恶意攻击行为。应更改为复杂的用户名,以加强帐户的安全性。也不要使用admin或administrator,因为它们也在易于猜测的用户词典中。mysql>updateusersetuser="new-root-name"whereuser="root";mysql>flushprivileges;//强制刷新内存授权表,否则内存中还缓存的密码需要正确分配给用户,不要设置所有权限分配给普通用户,有选择地分配读写权限,比如只分配查询权限给用户。mysql>grantSELECTondb.tabletousername@'localhost'不要把withgrant选项授权给普通用户,防止普通用户给别人授予权限,造成管理混乱。表1是常用的权限和说明。表1常用权限及说明4.数据库安全默认MySQL在安装初始化后会自动生成一个空的用户和测试库,用于安装测试。这将对数据库的安全构成威胁。有必要将它们全部删除。在最终状态下,只保留一个根。能。当然,以后可以根据需要添加用户和数据库。mysql>showdatabases;mysql>dropdatabasetest;//删除数据库testusemysql;deletefromdb;//删除存储数据库的表信息,因为没有数据库信息mysql>deletefromuserwherenot(user='root');//删除初始非-rootusermysql>deletefromuserwhereuser='root'andpassword=;//删除空密码rootQueryOK,2rowsaffected(0.00sec)mysql>flushprivileges;//强制刷新内存授权表5.限制未授权IP访问。如果是单机运行MySQL,建议启用skip-Networking,可以完全关闭MySQL的TCP/IP连接方式。#my.iniskip-networking如果使用固定IP访问MySQL,可以在配置文件中添加bind-address=IP,前提是skip-networking关闭。绑定地址=10.10.1.16。文件读取安全在MySQL中,使用loaddatalocalinfile命令提供读取本地文件的功能。在5.0版本中,此选项默认启用。该操作会使用MySQL将本地文件读入数据库,攻击者就可以非法获取敏感信息。如果不需要读取本地文件,应该关闭。Loaddatalocalinfile在网上流传的一些攻击方式中使用,也被很多新发现的SQLInjection攻击使用。攻击者还可以通过loaddatalocalinfile将“/etc/passwd”加载到数据库表中,然后用SELECT显示出来,这对服务器的安全是致命的。您可以在my.cnf中添加local-infile=0参数。vim/etc/my.cnf[mysqld]set-variable=local-infile=0或者在MySQL启动时加入local-infile=0参数。/usr/local/mysql/bin/mysqld_safe--user=mysql--local-infile=0&7。常用的安全选项以下是MySQL自身提供的一些安全选项,在使用MySQL服务时可以根据自己的需要灵活配置。--allow-suspicious-udfs该选项控制是否可以加载主函数只有xxx符号的用户自定义函数,如xxx_init()、xxx_deinit()、xxx_reset()、xxx_clear()、xxx_add()等函数.默认情况下,此选项处于关闭状态,并且只能加载至少具有辅助项的UDF。这可以防止从不包含合法UDF的共享对象文件中加载函数。--local-infile[={0|1}]如果服务器以--local-infile=0启动,客户端不能使用LOCALINLOADDATA语句。--old-passwords强制服务器为新密码生成短的(pre-4.1)散列密码。当服务器必须支持旧版本的客户端程序时,这对于确保兼容性很有用。(过时)--safe-show-database在以前版本的MySQL中,此选项导致SHOWDATABASES语句仅显示用户具有部分权限的数据库名称。在MySQL5.1中,此选项现在不再用作默认行为,并且有一个SHOWDATABASES权限可用于控制每个帐户对数据库名称的访问。--safe-user-create如果启用,则用户不能使用GRANT语句创建新用户,除非用户对mysql.user表具有INSERT权限。如果想让用户有创建新用户的授权权限,给用户以下权限。mysql>GRANTINSERT(user)ONmysql.userTO'user_name'@'host_name';这保证了用户不能直接改变权限列,必须使用GRANT语句将这个权限授予其他用户。--secure-auth禁止使用旧(4.1之前)密码对帐户进行身份验证。--skip-grant-tables这个选项会导致服务器根本不使用权限系统,让每个人都能完全访问所有数据库!(通过执行mysqladminflush-privileges或mysqladmineload命令,或通过执行FLUSHPRIVILEGES语句,可以告诉正在运行的服务器再次开始使用授权表。)--skip-name-resolve主机名未解析。授权表中所有Host列值必须是IP号或localhost。--skip-networking不允许网络上的TCP/IP连接。所有与mysqld的连接都必须通过Unix套接字进行。--skip-show-database使用该选项只允许具有SHOWDATABASES权限的用户执行SHOWDATABASES语句,该语句显示所有数据库名称。如果没有这个选项,则允许所有用户执行SHOWDATABASES,但只显示用户具有SHOWDATABASES权限或部分数据库权限的数据库名称。请注意,全局权限是指对数据库的权限。8、数据安全在生产环境中,数据库可能会遇到各种导致数据丢失的意外事件,如硬件故障、软件故障、自然灾害、恶意攻击者的攻击、误操作等都会造成数据的损坏或丢失。为了在数据丢失后及时恢复数据,需要定期备份数据。备份数据的策略需要根据不同的业务场景进行定制。大致有几个参考值,可以用来定制特定环境下的数据备份策略。(1)可以容忍多少数据丢失。(2)恢复数据需要多长时间。(3)需要恢复哪些数据。根据业务场景的需要选择备份方式是全量备份、增量备份还是差异备份。

最新推荐
猜你喜欢