挠头的php连接mysql数据库的报错,终于解决了,赶紧分享出来,大家少踩坑吧

kakaxi 发表了文章 • 0 个评论 • 260 次浏览 • 2018-06-05 19:01 • 来自相关话题

       最近马上要对一些互联网企业的技术人员举行培训,想着今天要把我们自己的攻防演练的靶场搭建起来,提前备课,kakaxi有一个习惯,再熟悉的课程也会在培训之前进行备课(感觉在夸自己认真负责了,自己都不好意思了),但是始终报一个错误:
连接mysql数据时提示错误: “ERROR 1698 (28000): Access denied for user ‘root’@’localhost'”,网上众说纷纭,很多方法都不灵,有很多只告诉了方法,而且还不好使,都是一知半解,没有分析问题的原因的,所以,经过自虐了好长一段时间,终于算是找到根上了。 
环境介绍: 

操作系统:Linux kali 4.15.0-kali2-amd64 #1 SMP Debian 4.15.11-1kali1 (2018-03-21) x86_64 GNU/Linux
PHP版本:PHP 7.2.4-1 (cli) (built: Apr  5 2018 08:50:27) ( NTS )  
数据库:mysql  Ver 15.1 Distrib 10.1.29-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

 
问题现象就是:

web页面报错 :「Could not connect:」
web服务器日志  /var/log/apache2/error.log 中显示如下错误:[Tue Jun 05 06:12:55.420068 2018] [php7:warn] [pid 9648] [client 172.16.155.1:56318] PHP Warning: mysqli_connect(): (HY000/1698): Access denied for user 'root'@'localhost' in /var/www/html/sys/config.php on line 7在系统上,使用root帐号登录mysql是没有问题的:root@kali:/var/www/html# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 66
Server version: 10.1.29-MariaDB-6 Debian buildd-unstable

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
如果输入 mysql -h 127.0.0.1 -uroot -p,就加入了一个-h的参数指定服务器的地址,就会禁止登录(有同学会问,为啥要这样做,其实就是为了模拟web服务器连接数据库的过程,所以你应该懂得)root@kali:/var/www/html# mysql -h 127.0.0.1 -uroot -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
用户名是root,密码为空

原因分析:

为了找到这个问题:查看了数据库用户的信息,确定了两个关键的字段;


MariaDB [(none)]> select user,plugin from mysql.user;
+------+-------------+
| user | plugin |
+------+-------------+
| root | unix_socket |
| wt | |
+------+-------------+
2 rows in set (0.00 sec)

这个里面非常关键的信息就是在数据库用户的表里有一个列属性是plugin,mysql从5.5.7开始引入plugins 以进行用户连接时的密码验证,plugin创建外部/代理用户。mysql官网上原文如下:


Plugins for authenticating attempts by clients to connect to MySQL Server. Plugins are available for several authentication protocols.


进一步查看相关内容得到:
Plugin主要提供了三中方法:unix_socket、mysql_native_password、 mysql_old_password(在 MySQL 5.7.5版本已经被废除掉了)
 
其中mysql_native_password是指使用mysql数据库中的user表里的用户密码进行验证,unix_socket 是 socket 链接。  所以需要将root用户的plugin 值由unix_socket 改为mysql_native_password,然后就flush privileges ,重启mysql服务,果然ok了。
具体过程如下:
root@kali:/var/www/html# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 69
Server version: 10.1.29-MariaDB-6 Debian buildd-unstable

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> update user set plugin='mysql_native_password' where user='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [mysql]> select user,plugin from user;
+------+-----------------------+
| user | plugin |
+------+-----------------------+
| root | mysql_native_password |
| wt | |
+------+-----------------------+
2 rows in set (0.00 sec)

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
root@kali:/var/www/html# service mysql restart
root@kali:/var/www/html#
再次打开网页,Happy,Happy,我又看到了熟悉的界面
 





 
 

  查看全部
       最近马上要对一些互联网企业的技术人员举行培训,想着今天要把我们自己的攻防演练的靶场搭建起来,提前备课,kakaxi有一个习惯,再熟悉的课程也会在培训之前进行备课(感觉在夸自己认真负责了,自己都不好意思了),但是始终报一个错误:
连接mysql数据时提示错误: “ERROR 1698 (28000): Access denied for user ‘root’@’localhost'”,网上众说纷纭,很多方法都不灵,有很多只告诉了方法,而且还不好使,都是一知半解,没有分析问题的原因的,所以,经过自虐了好长一段时间,终于算是找到根上了。 
环境介绍: 


操作系统:Linux kali 4.15.0-kali2-amd64 #1 SMP Debian 4.15.11-1kali1 (2018-03-21) x86_64 GNU/Linux
PHP版本:PHP 7.2.4-1 (cli) (built: Apr  5 2018 08:50:27) ( NTS )  
数据库:mysql  Ver 15.1 Distrib 10.1.29-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2


 
问题现象就是:


web页面报错 :「Could not connect:」
web服务器日志  /var/log/apache2/error.log 中显示如下错误:

[Tue Jun 05 06:12:55.420068 2018] [php7:warn] [pid 9648] [client 172.16.155.1:56318] PHP Warning:  mysqli_connect(): (HY000/1698): Access denied for user 'root'@'localhost' in /var/www/html/sys/config.php on line 7
在系统上,使用root帐号登录mysql是没有问题的:
root@kali:/var/www/html# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 66
Server version: 10.1.29-MariaDB-6 Debian buildd-unstable

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
如果输入 mysql -h 127.0.0.1 -uroot -p,就加入了一个-h的参数指定服务器的地址,就会禁止登录(有同学会问,为啥要这样做,其实就是为了模拟web服务器连接数据库的过程,所以你应该懂得)
root@kali:/var/www/html# mysql -h 127.0.0.1 -uroot -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
用户名是root,密码为空


原因分析:


为了找到这个问题:查看了数据库用户的信息,确定了两个关键的字段;



MariaDB [(none)]> select user,plugin from mysql.user;
+------+-------------+
| user | plugin |
+------+-------------+
| root | unix_socket |
| wt | |
+------+-------------+
2 rows in set (0.00 sec)

这个里面非常关键的信息就是在数据库用户的表里有一个列属性是plugin,mysql从5.5.7开始引入plugins 以进行用户连接时的密码验证,plugin创建外部/代理用户。mysql官网上原文如下:



Plugins for authenticating attempts by clients to connect to MySQL Server. Plugins are available for several authentication protocols.


进一步查看相关内容得到:
Plugin主要提供了三中方法:unix_socket、mysql_native_password、 mysql_old_password(在 MySQL 5.7.5版本已经被废除掉了)
 
其中mysql_native_password是指使用mysql数据库中的user表里的用户密码进行验证,unix_socket 是 socket 链接。  所以需要将root用户的plugin 值由unix_socket 改为mysql_native_password,然后就flush privileges ,重启mysql服务,果然ok了。
具体过程如下:
root@kali:/var/www/html# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 69
Server version: 10.1.29-MariaDB-6 Debian buildd-unstable

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> update user set plugin='mysql_native_password' where user='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [mysql]> select user,plugin from user;
+------+-----------------------+
| user | plugin |
+------+-----------------------+
| root | mysql_native_password |
| wt | |
+------+-----------------------+
2 rows in set (0.00 sec)

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
root@kali:/var/www/html# service mysql restart
root@kali:/var/www/html#
再次打开网页,Happy,Happy,我又看到了熟悉的界面
 

WX20180605-185526@2x.png

 
 


 


sql server update 报错注入

发表了文章 • 1 个评论 • 572 次浏览 • 2017-09-22 11:06 • 来自相关话题

众测的时候碰到的,好像这个也没什么可写的。
update mosuan set xx=11,bb='xx',nobb=1 where id = 1
直接利用类型转换来报错就可以了。
update mosuan set xx=11,bb='xx'+db_name()+1+'',nobb=1 where id = 1
sql server字符串和数字进行比较的时候就会报错并把字符串的内容显示到错误上。
  查看全部
众测的时候碰到的,好像这个也没什么可写的。
update mosuan set xx=11,bb='xx',nobb=1 where id = 1

直接利用类型转换来报错就可以了。
update mosuan set xx=11,bb='xx'+db_name()+1+'',nobb=1 where id = 1

sql server字符串和数字进行比较的时候就会报错并把字符串的内容显示到错误上。
 

【答案已发】【SQL注入挑战】你好我是宇智波铁柱,英文名: .......

发表了文章 • 4 个评论 • 656 次浏览 • 2017-08-02 21:11 • 来自相关话题

要求:报错注入,别扫描,拿到数据库里面flag{xxxxx}的字样
数据库名:sqltest
题目地址:sqltest233.0aa.me/sqltest/index.php?id=2017.08.03 10:00 更新:增加过滤单双引号;
2017.08.03 11:46 提示:多刷刷前几天的rss2017.08.03 14:07 提示2:join
 
答案在附件里面。
  查看全部
要求:报错注入,别扫描,拿到数据库里面flag{xxxxx}的字样
数据库名:sqltest  
题目地址:sqltest233.0aa.me/sqltest/index.php?id=
2017.08.03 10:00 更新:增加过滤单双引号;
2017.08.03 11:46 提示:多刷刷前几天的rss
2017.08.03 14:07 提示2:join
 
答案在附件里面。
 

百度SQL注入挑战赛payload

发表了文章 • 4 个评论 • 501 次浏览 • 2017-07-21 22:13 • 来自相关话题

5月份的时候参加了一次百度的sql注入挑战赛,没有太多的亮点。
 
详情看附件吧。
 
转载带上Auther: Mosuan 就行。
5月份的时候参加了一次百度的sql注入挑战赛,没有太多的亮点。
 
详情看附件吧。
 
转载带上Auther: Mosuan 就行。

MySQL安全策略

ttgo2 发表了文章 • 2 个评论 • 405 次浏览 • 2017-06-15 11:06 • 来自相关话题

转载一下:我猜你一定达不到满分的《MySQL安全策略》 知数堂  
我的一个老朋友,做了dba多年,站在一个dba的角度上分析安全蛮有意思的,,,这里跟大家分享一下

除了MySQL自身的账号密码安全管理,系统层面、应用层面的安全策略你注意到了吗?

数据是企业核心资产,数据对企业而言是最重要的工作之一。稍有不慎,极有可能发生数据无意泄露,甚至被黑客恶意窃取的风险。每年业界都会传出几起大事件,某知名或不知名的公司被脱裤(拖库的谐音,意思是整个数据库被黑客盗取)之类的。

从数据安全上也可以分为外网安全及内部操作安全,下面分别讨论一下。

内部操作安全策略
是否回收DBA全部权限
试想,如果DBA没权限了,日常DB运维的活,以及紧急故障处理,该怎么实施呢?因此,建议在没有成熟的自动化运维平台前,不应该粗暴的回收DBA的太多权限,否则可能会导致工作效率降低的,甚至DBA有一种不被信任的负面情绪。

MySQL层安全策略
业务帐号最多只可以通过内网远程登录,而不能通过公网远程连接。

增加运维平台账号,该账号允许从专用的管理平台服务器远程连接。当然了,要对管理平台部署所在服务器做好安全措施以及必要的安全审计策略。

建议启用数据库审计功能。这需要使用MySQL企业版,或者Percona/MariaDB分支版本,MySQL社区版本不支持该功能。

启用 safe-update 选项,避免没有 WHERE 条件的全表数据被修改;

在应用中尽量不直接DELETE删除数据,而是设置一个标志位就好了。需要真正删除时,交由DBA先备份后再物理删除,避免误操作删除全部数据。

还可以采用触发器来做一些辅助功能,比如防止黑客恶意篡改数据。

MySQL账号权限规则
业务帐号,权限最小化,坚决不允许DROP、TRUNCATE权限。

业务账号默认只授予普通的DML所需权限,也就是select、update、insert、delete、execute等几个权限,其余不给。

MySQL初始化后,先行删除无用账号,删除匿名test数据库mysql> delete from mysql.user where user!='root' or host!='localhost'; flush privileges; mysql> drop database test;创建备份专用账号,只有SELECT权限,且只允许本机可登入。

设置MySQL账号的密码安全策略,包括长度、复杂性。

关于数据备份
记住,做好数据全量备份是系统崩溃无法修复时的最后一概救命稻草。
备份数据还可以用来做数据审计或是用于数据仓库的数据源拉取之用。
一般来说,备份策略是这样的:每天一次全备,并且定期对binlog做增备,或者直接利用binlog server机制将binlog传输到其他远程主机上。有了全备+binlog,就可以按需恢复到任何时间点。
特别提醒:当采用xtrabackup的流式备份时,考虑采用加密传输,避免备份数据被恶意截取。


外网安全策略

事实上,操作系统安及应用安全要比数据库自身的安全策略更重要。同理,应用程序及其所在的服务器端的系统安全也很重要,很多数据安全事件,都是通过代码漏洞入侵到应用服务器,再去探测数据库,最后成功拖库。

操作系统安全建议
运行MySQL的Linux必须只运行在内部网络,不允许直接对公网暴露,实在有需要从公网连接的话,再通过跳板机做端口转发,并且如上面所述,要严格限制数据库账号权限级别。

系统账号都改成基于ssh key认证,不允许远程密码登入,且ssh key的算法、长度有要求以确保相对安全。这样就没有密码丢失的风险,除非个人的私钥被盗。

进一步的话,甚至可以对全部服务器启用PAM认证,做到账号的统一管理,也更方便、安全。

关闭不必要的系统服务,只开必须的进程,例如 mysqld、sshd、networking、crond、syslogd 等服务,其它的都关闭。

禁止root账号远程登录。

禁止用root账号启动mysqld等普通业务服务进程。

sshd服务的端口号建议修改成10000以上。

在不影响性能的前提下,尽可能启用对MySQL服务端口的防火墙策略(高并发时,采用iptables可能影响性能,建议改用ip route策略)。

GRUB必须设置密码,物理服务器的Idrac/imm/ilo等账号默认密码也要修改。

每个需要登入系统的员工,都使用每个人私有帐号,而不是使用公共账号。

应该启用系统层的操作审计,记录所有ssh日志,或利bash记录相应的操作命令并发送到远程服务器,然后进行相应的安全审计,及时发现不安全操作。

正确设置MySQL及其他数据库服务相关目录权限,不要全是755,一般750就够了。

可以考虑部署堡垒机,所有连接远程服务器都需要先通过堡垒机,堡垒机上就可以实现所有操作记录以及审计功能了。

脚本加密对安全性提升其实没太大帮助。对有经验的黑客来说,只要有系统登入权限,就可以通过提权等方式轻松获得root。

应用安全建议
禁用web server的autoindex配置。

从制度层面,杜绝员工将代码上传到外部github上,因为很可能存在内部IP、账号密码泄露的风险,真的要上传必须先经过安全审核。

尽量不要在公网上使用开源的cms、blog、论坛等系统,除非做过代码安全审计,或者事先做好安全策略。这类系统一般都是黑客重点研究对象,很容易被搞;

在web server层,可以用一些安全模块,比如nginx的WAF模块;

在app server层,可以做好代码安全审计、安全扫描,防止XSS攻击、CSRF攻击、SQL注入、文件上传攻击、绕过cookie检测等安全漏洞;

应用程序中涉及账号密码的地方例如JDBC连接串配置,尽量把明文密码采用加密方式存储,再利用内部私有的解密工具进行反解密后再使用。或者可以让应用程序先用中间账号连接proxy层,再由proxy连接MySQL,避免应用层直连MySQL;

最后我们想说,任何高明的安全策略,都不如内部员工的安全意识来的重要。以前发生过一起案例,公司内有位员工的PC不慎中毒,结果导致内网数据被盗。

安全无小事,每个人都应铭记于心。在数据安全面前,可以适当牺牲一些便利性,当然也不能太过,否则可能得不偿失。
  查看全部
转载一下:我猜你一定达不到满分的《MySQL安全策略》 知数堂  
我的一个老朋友,做了dba多年,站在一个dba的角度上分析安全蛮有意思的,,,这里跟大家分享一下


除了MySQL自身的账号密码安全管理,系统层面、应用层面的安全策略你注意到了吗?

数据是企业核心资产,数据对企业而言是最重要的工作之一。稍有不慎,极有可能发生数据无意泄露,甚至被黑客恶意窃取的风险。每年业界都会传出几起大事件,某知名或不知名的公司被脱裤(拖库的谐音,意思是整个数据库被黑客盗取)之类的。

从数据安全上也可以分为外网安全及内部操作安全,下面分别讨论一下。

内部操作安全策略
  1. 是否回收DBA全部权限

试想,如果DBA没权限了,日常DB运维的活,以及紧急故障处理,该怎么实施呢?因此,建议在没有成熟的自动化运维平台前,不应该粗暴的回收DBA的太多权限,否则可能会导致工作效率降低的,甚至DBA有一种不被信任的负面情绪。

  1. MySQL层安全策略

业务帐号最多只可以通过内网远程登录,而不能通过公网远程连接。

增加运维平台账号,该账号允许从专用的管理平台服务器远程连接。当然了,要对管理平台部署所在服务器做好安全措施以及必要的安全审计策略。

建议启用数据库审计功能。这需要使用MySQL企业版,或者Percona/MariaDB分支版本,MySQL社区版本不支持该功能。

启用 safe-update 选项,避免没有 WHERE 条件的全表数据被修改;

在应用中尽量不直接DELETE删除数据,而是设置一个标志位就好了。需要真正删除时,交由DBA先备份后再物理删除,避免误操作删除全部数据。

还可以采用触发器来做一些辅助功能,比如防止黑客恶意篡改数据。

  1. MySQL账号权限规则

业务帐号,权限最小化,坚决不允许DROP、TRUNCATE权限。

业务账号默认只授予普通的DML所需权限,也就是select、update、insert、delete、execute等几个权限,其余不给。

MySQL初始化后,先行删除无用账号,删除匿名test数据库mysql> delete from mysql.user where user!='root' or host!='localhost'; flush privileges; mysql> drop database test;创建备份专用账号,只有SELECT权限,且只允许本机可登入。

设置MySQL账号的密码安全策略,包括长度、复杂性。

  1. 关于数据备份

记住,做好数据全量备份是系统崩溃无法修复时的最后一概救命稻草。
备份数据还可以用来做数据审计或是用于数据仓库的数据源拉取之用。
一般来说,备份策略是这样的:每天一次全备,并且定期对binlog做增备,或者直接利用binlog server机制将binlog传输到其他远程主机上。有了全备+binlog,就可以按需恢复到任何时间点。
特别提醒:当采用xtrabackup的流式备份时,考虑采用加密传输,避免备份数据被恶意截取。


外网安全策略

事实上,操作系统安及应用安全要比数据库自身的安全策略更重要。同理,应用程序及其所在的服务器端的系统安全也很重要,很多数据安全事件,都是通过代码漏洞入侵到应用服务器,再去探测数据库,最后成功拖库。

  1. 操作系统安全建议

运行MySQL的Linux必须只运行在内部网络,不允许直接对公网暴露,实在有需要从公网连接的话,再通过跳板机做端口转发,并且如上面所述,要严格限制数据库账号权限级别。

系统账号都改成基于ssh key认证,不允许远程密码登入,且ssh key的算法、长度有要求以确保相对安全。这样就没有密码丢失的风险,除非个人的私钥被盗。

进一步的话,甚至可以对全部服务器启用PAM认证,做到账号的统一管理,也更方便、安全。

关闭不必要的系统服务,只开必须的进程,例如 mysqld、sshd、networking、crond、syslogd 等服务,其它的都关闭。

禁止root账号远程登录。

禁止用root账号启动mysqld等普通业务服务进程。

sshd服务的端口号建议修改成10000以上。

在不影响性能的前提下,尽可能启用对MySQL服务端口的防火墙策略(高并发时,采用iptables可能影响性能,建议改用ip route策略)。

GRUB必须设置密码,物理服务器的Idrac/imm/ilo等账号默认密码也要修改。

每个需要登入系统的员工,都使用每个人私有帐号,而不是使用公共账号。

应该启用系统层的操作审计,记录所有ssh日志,或利bash记录相应的操作命令并发送到远程服务器,然后进行相应的安全审计,及时发现不安全操作。

正确设置MySQL及其他数据库服务相关目录权限,不要全是755,一般750就够了。

可以考虑部署堡垒机,所有连接远程服务器都需要先通过堡垒机,堡垒机上就可以实现所有操作记录以及审计功能了。

脚本加密对安全性提升其实没太大帮助。对有经验的黑客来说,只要有系统登入权限,就可以通过提权等方式轻松获得root。

  1. 应用安全建议

禁用web server的autoindex配置。

从制度层面,杜绝员工将代码上传到外部github上,因为很可能存在内部IP、账号密码泄露的风险,真的要上传必须先经过安全审核。

尽量不要在公网上使用开源的cms、blog、论坛等系统,除非做过代码安全审计,或者事先做好安全策略。这类系统一般都是黑客重点研究对象,很容易被搞;

在web server层,可以用一些安全模块,比如nginx的WAF模块;

在app server层,可以做好代码安全审计、安全扫描,防止XSS攻击、CSRF攻击、SQL注入、文件上传攻击、绕过cookie检测等安全漏洞;

应用程序中涉及账号密码的地方例如JDBC连接串配置,尽量把明文密码采用加密方式存储,再利用内部私有的解密工具进行反解密后再使用。或者可以让应用程序先用中间账号连接proxy层,再由proxy连接MySQL,避免应用层直连MySQL;

最后我们想说,任何高明的安全策略,都不如内部员工的安全意识来的重要。以前发生过一起案例,公司内有位员工的PC不慎中毒,结果导致内网数据被盗。

安全无小事,每个人都应铭记于心。在数据安全面前,可以适当牺牲一些便利性,当然也不能太过,否则可能得不偿失。
 

Mysql关于secure_file_priv读取文件,文件导入导出操作的一些问题

zksmile 发表了文章 • 2 个评论 • 1537 次浏览 • 2017-06-06 09:54 • 来自相关话题

secure-file-priv特性secure-file-priv参数是用来限制LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE()传到哪个指定目录的。
[]secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出。[/][]当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下。[/][]当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制。[/]
 
在mysql中(ps:百度说是在5.7.6之后默认为NULL,但是我最近下载的phpstudy (mysql:5.5.53)和 mamp(mysql:5.6.35) 默认值都是为NULL,可能是现在集成环境也意识到这些安全问题,做出了更改。)
secure-file-priv默认的值是为NULL,无法进行读写,导入导出操作。
 
如何查看secure_file_priv参数的值:show global variables like 'secure_file_priv';







 
解决问题:

windows下:修改my.ini 在[mysqld]内加入secure_file_priv =
linux下:      修改my.cnf 在[mysqld]内加入secure_file_priv =

然后重启mysql,再查询secure_file_priv
 











希望对大家有点帮助。 查看全部
secure-file-priv特性secure-file-priv参数是用来限制LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE()传到哪个指定目录的。
    []secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出。[/][]当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下。[/][]当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制。[/]

 
在mysql中(ps:百度说是在5.7.6之后默认为NULL,但是我最近下载的phpstudy (mysql:5.5.53)和 mamp(mysql:5.6.35) 默认值都是为NULL,可能是现在集成环境也意识到这些安全问题,做出了更改。)
secure-file-priv默认的值是为NULL,无法进行读写,导入导出操作。
 
如何查看secure_file_priv参数的值:
show global variables like 'secure_file_priv';



53C07EEB-AA9A-4A51-B48B-F42EE154E7E5.png

 
解决问题:


windows下:修改my.ini 在[mysqld]内加入secure_file_priv =
linux下:      修改my.cnf 在[mysqld]内加入secure_file_priv =

然后重启mysql,再查询secure_file_priv
 



4DFC4AC7-506B-43FD-ACBF-5DCD0C114025.png


6E850ED3-2D98-4185-ACDB-F5847EDB3588.png

希望对大家有点帮助。

忘记你太容易,得到你不容易,mysql 密码找回

ttgo2 发表了文章 • 1 个评论 • 403 次浏览 • 2017-05-22 13:08 • 来自相关话题

其实mysql忘记密码情况很多,做特别是做运维和安全的朋友,总担心安全问题,密码太多记不住,mysql忘记也正常,这里我们各种系统环境下的情况给大家总结一下,以后别的地方不用去看了,这里就是你的归宿,,哈哈,,不罗嗦,,直接开始。。

第一种:ubuntu 14的环境,
step1: 修改mysql的配置文件,文件的位置是/etc/mysql/my.cnf
vi /etc/mysql/my.cnf






step2: 重启服务
service mysql restart

step3: 修改密码
    MySQL>mysql -uroot
    MySQL>use mysql
    MySQL>update user set password=PASSWORD("newpassword") where user='root';
 

方法2:Linux
1.KILL掉系统里的MySQL进程;
    killall -TERM MySQLd 
2.用以下命令启动MySQL,以不检查权限的方式启动;
    safe_MySQLd --skip-grant-tables & 
3.然后用空密码方式使用root用户登录 MySQL;
    MySQL -u root 
4.修改root用户的密码;
    MySQL> update MySQL.user set password=PASSWORD('新密码') where User='root';  
    MySQL> flush privileges;  
    MySQL> quit 
 

第二种环境:windows
1.以系统管理员身份登陆系统。
2.打开cmd-----net start 查看mysql是否启动。启动的话就停止net stop mysql.
3.我的mysql安装在d:\usr\local\mysql4\bin下。
4.跳过权限检查启动mysql.
d:\usr\local\mysql\bin\mysqld-nt --skip-grant-tables
5.重新打开cmd。进到d:\usr\local\mysql4\bin下:
d:\usr\local\mysql\bin\mysqladmin -u root flush-privileges password "newpassword"
d:\usr\local\mysql\bin\mysqladmin -u root -p shutdown  这句提示你重新输密码。
6.在cmd里net start mysql

 
 
 

  查看全部

其实mysql忘记密码情况很多,做特别是做运维和安全的朋友,总担心安全问题,密码太多记不住,mysql忘记也正常,这里我们各种系统环境下的情况给大家总结一下,以后别的地方不用去看了,这里就是你的归宿,,哈哈,,不罗嗦,,直接开始。。

第一种:ubuntu 14的环境
step1: 修改mysql的配置文件,文件的位置是/etc/mysql/my.cnf
vi /etc/mysql/my.cnf

1.png


step2: 重启服务
service mysql restart

step3: 修改密码
    MySQL>mysql -uroot
    MySQL>use mysql
    MySQL>update user set password=PASSWORD("newpassword") where user='root';
 

方法2:Linux
1.KILL掉系统里的MySQL进程;
    killall -TERM MySQLd 
2.用以下命令启动MySQL,以不检查权限的方式启动;
    safe_MySQLd --skip-grant-tables & 
3.然后用空密码方式使用root用户登录 MySQL;
    MySQL -u root 
4.修改root用户的密码;
    MySQL> update MySQL.user set password=PASSWORD('新密码') where User='root';  
    MySQL> flush privileges;  
    MySQL> quit 
 

第二种环境:windows
1.以系统管理员身份登陆系统。
2.打开cmd-----net start 查看mysql是否启动。启动的话就停止net stop mysql.
3.我的mysql安装在d:\usr\local\mysql4\bin下。
4.跳过权限检查启动mysql.
d:\usr\local\mysql\bin\mysqld-nt --skip-grant-tables
5.重新打开cmd。进到d:\usr\local\mysql4\bin下:
d:\usr\local\mysql\bin\mysqladmin -u root flush-privileges password "newpassword"
d:\usr\local\mysql\bin\mysqladmin -u root -p shutdown  这句提示你重新输密码。
6.在cmd里net start mysql

 
 
 

 

mysql 安全问题研究(1)之--权限(文件读写)

ttgo2 发表了文章 • 5 个评论 • 446 次浏览 • 2017-04-17 10:33 • 来自相关话题

本文实例,运行于 MySQL 5.0 及以上版本。
MySQL 赋予用户权限命令的简单格式可概括为:

grant 权限 on 数据库对象 to 用户
 

一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。

grant select on testdb.* to common_user@'%'
grant insert on testdb.* to common_user@'%'
grant update on testdb.* to common_user@'%'
grant delete on testdb.* to common_user@'%'
或者,用一条 MySQL 命令来替代:

grant select, insert, update, delete on testdb.* to common_user@'%'
 

二、grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。

grant 创建、修改、删除 MySQL 数据表结构权限。

grant create on testdb.* to developer@'192.168.0.%';
grant alter  on testdb.* to developer@'192.168.0.%';
grant drop   on testdb.* to developer@'192.168.0.%';
 
grant 操作 MySQL 外键权限。

grant references on testdb.* to developer@'192.168.0.%';
 

grant 操作 MySQL 临时表权限。

grant create temporary tables on testdb.* to developer@'192.168.0.%';
 

grant 操作 MySQL 索引权限。

grant index on testdb.* to developer@'192.168.0.%';
 

grant 操作 MySQL 视图、查看视图源代码 权限。

grant create view on testdb.* to developer@'192.168.0.%';
grant show   view on testdb.* to developer@'192.168.0.%';
 

grant 操作 MySQL 存储过程、函数 权限。

grant create routine on testdb.* to developer@'192.168.0.%'; -- now, can show procedure status
grant alter  routine on testdb.* to developer@'192.168.0.%'; -- now, you can drop a procedure
grant execute        on testdb.* to developer@'192.168.0.%';
 

三、grant 普通 DBA 管理某个 MySQL 数据库的权限。

grant all privileges on testdb to dba@'localhost'
其中,关键字 “privileges” 可以省略。


四、grant 高级 DBA 管理 MySQL 中所有数据库的权限。

grant all on . to dba@'localhost'
 
五、MySQL grant 权限,分别可以作用在多个层次上。

grant 作用在整个 MySQL 服务器上:
grant select on . to dba@localhost; -- dba 可以查询 MySQL 中所有数据库中的表。
grant all    on . to dba@localhost; -- dba 可以管理 MySQL 中的所有数据库
 

grant 作用在单个数据库上:
grant select on testdb.* to dba@localhost; -- dba 可以查询 testdb 中的表。
 

grant 作用在单个数据表上:
grant select, insert, update, delete on testdb.orders to dba@localhost;
 

这里在给一个用户授权多张表时,可以多次执行以上语句。例如:

grant select(user_id,username) on smp.users to mo_user@'%' identified by '123345';
grant select on smp.mo_sms to mo_user@'%' identified by '123345';

grant 作用在表中的列上:
grant select(id, se, rank) on testdb.apache_log to dba@localhost;
 

grant 作用在存储过程、函数上:
grant execute on procedure testdb.pr_add to 'dba'@'localhost'
grant execute on function testdb.fn_add to 'dba'@'localhost'
 

 

 

六、查看 MySQL 用户权限

查看当前用户(自己)权限:

show grants;
 
查看其他 MySQL 用户权限:

show grants for dba@localhost;
 

 
七、撤销已经赋予给 MySQL 用户权限的权限。

revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:

grant  all on . to   dba@localhost;
revoke all on . from dba@localhost;
 

八、MySQL grant、revoke 用户权限注意事项

grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。
如果想让授权的用户,也可以将这些权限 grant 给其他用户,需要选项 “grant option“
grant select on testdb.* to dba@localhost with grant option;
这个特性一般用不到。实际中,数据库权限最好由 DBA 来统一管理。
 

*************************************************************************************************


遇到 SELECT command denied to user '用户名'@'主机名' for table '表名' 这种错误,解决方法是需要把吧后面的表名授权,即是要你授权核心数据库也要。

我遇到的是SELECT command denied to user 'my'@'%' for table 'proc',是调用存储过程的时候出现,原以为只要把指定的数据库授权就行了,什么存储过程、函数等都不用再管了,谁知道也要把数据库mysql的proc表授权


*************************************************************************************************

参考:http://zhidao.baidu.com/question/19633785.html

mysql授权表共有5个表:user、db、host、tables_priv和columns_priv。

授权表的内容有如下用途:
user表
user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。

db表
db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。

host表
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。

tables_priv表
tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。

columns_priv表
columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。 查看全部
本文实例,运行于 MySQL 5.0 及以上版本。
MySQL 赋予用户权限命令的简单格式可概括为:

grant 权限 on 数据库对象 to 用户
 

一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。

grant select on testdb.* to common_user@'%'
grant insert on testdb.* to common_user@'%'
grant update on testdb.* to common_user@'%'
grant delete on testdb.* to common_user@'%'
或者,用一条 MySQL 命令来替代:

grant select, insert, update, delete on testdb.* to common_user@'%'
 

二、grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。

grant 创建、修改、删除 MySQL 数据表结构权限。

grant create on testdb.* to developer@'192.168.0.%';
grant alter  on testdb.* to developer@'192.168.0.%';
grant drop   on testdb.* to developer@'192.168.0.%';
 
grant 操作 MySQL 外键权限。

grant references on testdb.* to developer@'192.168.0.%';
 

grant 操作 MySQL 临时表权限。

grant create temporary tables on testdb.* to developer@'192.168.0.%';
 

grant 操作 MySQL 索引权限。

grant index on testdb.* to developer@'192.168.0.%';
 

grant 操作 MySQL 视图、查看视图源代码 权限。

grant create view on testdb.* to developer@'192.168.0.%';
grant show   view on testdb.* to developer@'192.168.0.%';
 

grant 操作 MySQL 存储过程、函数 权限。

grant create routine on testdb.* to developer@'192.168.0.%'; -- now, can show procedure status
grant alter  routine on testdb.* to developer@'192.168.0.%'; -- now, you can drop a procedure
grant execute        on testdb.* to developer@'192.168.0.%';
 

三、grant 普通 DBA 管理某个 MySQL 数据库的权限。

grant all privileges on testdb to dba@'localhost'
其中,关键字 “privileges” 可以省略。


四、grant 高级 DBA 管理 MySQL 中所有数据库的权限。

grant all on . to dba@'localhost'
 
五、MySQL grant 权限,分别可以作用在多个层次上。

  1. grant 作用在整个 MySQL 服务器上:

grant select on . to dba@localhost; -- dba 可以查询 MySQL 中所有数据库中的表。
grant all    on . to dba@localhost; -- dba 可以管理 MySQL 中的所有数据库
 

  1. grant 作用在单个数据库上:

grant select on testdb.* to dba@localhost; -- dba 可以查询 testdb 中的表。
 

  1. grant 作用在单个数据表上:

grant select, insert, update, delete on testdb.orders to dba@localhost;
 

这里在给一个用户授权多张表时,可以多次执行以上语句。例如:

grant select(user_id,username) on smp.users to mo_user@'%' identified by '123345';
grant select on smp.mo_sms to mo_user@'%' identified by '123345';

  1. grant 作用在表中的列上:

grant select(id, se, rank) on testdb.apache_log to dba@localhost;
 

  1. grant 作用在存储过程、函数上:

grant execute on procedure testdb.pr_add to 'dba'@'localhost'
grant execute on function testdb.fn_add to 'dba'@'localhost'
 

 

 

六、查看 MySQL 用户权限

查看当前用户(自己)权限:

show grants;
 
查看其他 MySQL 用户权限:

show grants for dba@localhost;
 

 
七、撤销已经赋予给 MySQL 用户权限的权限。

revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:

grant  all on . to   dba@localhost;
revoke all on . from dba@localhost;
 

八、MySQL grant、revoke 用户权限注意事项

  1. grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。

  1. 如果想让授权的用户,也可以将这些权限 grant 给其他用户,需要选项 “grant option“

grant select on testdb.* to dba@localhost with grant option;
这个特性一般用不到。实际中,数据库权限最好由 DBA 来统一管理。
 

*************************************************************************************************


遇到 SELECT command denied to user '用户名'@'主机名' for table '表名' 这种错误,解决方法是需要把吧后面的表名授权,即是要你授权核心数据库也要。

我遇到的是SELECT command denied to user 'my'@'%' for table 'proc',是调用存储过程的时候出现,原以为只要把指定的数据库授权就行了,什么存储过程、函数等都不用再管了,谁知道也要把数据库mysql的proc表授权


*************************************************************************************************

参考:http://zhidao.baidu.com/question/19633785.html

mysql授权表共有5个表:user、db、host、tables_priv和columns_priv。

授权表的内容有如下用途:
user表
user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。

db表
db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。

host表
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。

tables_priv表
tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。

columns_priv表
columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。

information_schema数据库表说明

乌云很白 发表了文章 • 4 个评论 • 366 次浏览 • 2017-02-25 12:30 • 来自相关话题

information_schema数据库表说明:

SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。

COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。

USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。

SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。

TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。

COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。

CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。

COLLATIONS表:提供了关于各字符集的对照信息。

COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。

TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。

KEY_COLUMN_USAGE表:描述了具有约束的键列。

ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。

VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。

TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表 查看全部
information_schema数据库表说明:

SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。

COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。

USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。

SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。

TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。

COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。

CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。

COLLATIONS表:提供了关于各字符集的对照信息。

COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。

TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。

KEY_COLUMN_USAGE表:描述了具有约束的键列。

ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。

VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。

TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表

mysql在已登录的情况下查看mysql端口

Mosuan 发表了文章 • 0 个评论 • 382 次浏览 • 2016-12-30 17:28 • 来自相关话题

show global variables like 'port';




 
show global variables like 'port';

11111.png