十一、mysql輸入安全,mysql
1.盡量使用“綁定參數”功能,php中可用pdo進行一系列操作
2.php可使用mysql_real_escape_string()函數進行輸入過濾;
怎對MySQL服務器進行安全的配置?
因

Chroot

原因

配置文件也會有所差異

假



實際操作

遇

相似

情況




卻

知道對其

何正確

解決




下

文章對

而言

定

良師益友

1.關閉遠程連接 首先

應該關閉3306端口



MySQL

默認監聽端口

由於此處MySQL只服務於本地腳本

所


需要遠程連接

盡管MySQL內建

安全機制

嚴格


監聽


TCP端口仍


危險

行


因



MySQL程序本身有問題



未授權

訪問完全


繞過MySQL

內建安全機制

關閉網絡監聽

方法

簡單


/chroot/mysql/etc/my.cnf文件


[mysqld]部分

去掉#skip-networking前面


#

即


關閉了網絡

本地程序

何連接MySQL數據庫呢

本地程序


通過mysql.sock來連接

速度比網絡連接更快


文

提

關於mysql.sock

具體情況

MySQL

備份通常使用SSH來執行

2.禁止MySQL導入本地文件 下面

禁止MySQL

用

LOAD DATA LOCAL INFILE

命令



命令會利用MySQL把本地文件讀

數據庫




用戶



非法獲取敏感信息了

了禁止上述命令


/chroot/mysql/etc/my.cnf文件

[mysqld]部分加入下面語句:set-variable=local-infile=0

了管理方便


般

系統


MySQL管理命令

mysql、mysqladmin、mysqldump等

使用

都

系統

/etc/my.cnf文件



要連接


會尋找/tmp/mysql.sock文件來試圖連接MySQL服務器




裡要連接


chroot下

MySQL服務器

解決辦法有兩

:




管理命令

面加入--socket=/chroot/mysql/tmp/mysql.sock

例

:#/usr/local/mysql/bin/mysql -root -p --socket=/chroot/mysql/tmp/mysql.sock 另





/etc/my.cnf

[client]部分加入socket=/chroot/mysql/tmp/mysql.sock

顯


第二種方法方便多了

3.修改MySQL

root用戶ID和密碼#chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld & #/usr/local/mysql/bin/mysql -uroot ....... mysql>SET PASSWORD FOR root@localhost=PASSWORD('new_password'); 要盡量養成

mysql下輸入密碼

習慣

因

Shell下面輸入

時候

能會被其

人看見

mysql>use mysql; mysql>update user set user="wghgreat" where user="root"; mysql>select Host,User,Password,Select_priv,Grant_priv from user; mysql>delete from user where user=''; mysql>delete from user where password=''; mysql>delete from user where host='%'; mysql>drop database test; 修改




容易猜

ID:mysql>flush privileges; mysql>quit; 4.刪除歷史命令記錄

些歷史文件包括~/.bash_history、~/.mysql_history等



打開

們


會大吃

驚



居

有

些明文

密碼


裡


#cat /dev/null > ~/.bash_history #cat /dev/null > ~/.mysql_history PHP和MySQL通信 默認情況下

PHP會通過/tmp/mysql.sock來和MySQL通信



裡



大問題

MySQL生成

根本




而

/chroot/mysql/tmp/mysql.sock

解決

辦法


做


連接:#ln /chroot/mysql/tmp/mysql.sock /tmp/mysql.sock 注意:由於hard links

能

文件系統

分區之間做

所

該處

連接必須位於同

分區內部
怎設置Mysql數據庫的安全
用


shell>chown -R mysql.mysql /usr/local/mysql/var
shell>chmod -R go-rwx /usr/local/mysql/var
改動

shell>ls -l /usr/local/mysql
total 40
drwxrwxr-x 2 root root 4096 Feb 27 20:07 bin
drwxrwxr-x 3 root root 4096 Feb 27 20:07 include
drwxrwxr-x 2 root root 4096 Feb 27 20:07 info
drwxrwxr-x 3 root root 4096 Feb 27 20:07 lib
drwxrwxr-x 2 root root 4096 Feb 27 20:07 libexec
drwxrwxr-x 3 root root 4096 Feb 27 20:07 man
drwxrwxr-x 6 root root 4096 Feb 27 20:07 mysql-test
drwxrwxr-x 3 root root 4096 Feb 27 20:07 share
drwxrwxr-x 7 root root 4096 Feb 27 20:07 sql-bench
drwx------ 4 mysql mysql 4096 Feb 27 20:07 var
shell>ls -l /usr/local/mysql/var
total 8
drwx------ 2 mysql mysql 4096 Feb 27 20:08 mysql
drwx------ 2 mysql mysql 4096 Feb 27 20:08 test
shell>ls -l /usr/local/mysql/var/mysql
total 104
-rw------- 1 mysql mysql 0 Feb 27 20:08 columns_priv.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 columns_priv.MYI
-rw------- 1 mysql mysql 8778 Feb 27 20:08 columns_priv.frm
-rw------- 1 mysql mysql 302 Feb 27 20:08 db.MYD
-rw------- 1 mysql mysql 3072 Feb 27 20:08 db.MYI
-rw------- 1 mysql mysql 8982 Feb 27 20:08 db.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 func.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 func.MYI
-rw------- 1 mysql mysql 8641 Feb 27 20:08 func.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 host.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 host.MYI
-rw------- 1 mysql mysql 8958 Feb 27 20:08 host.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 tables_priv.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 tables_priv.MYI
-rw------- 1 mysql mysql 8877 Feb 27 20:08 tables_priv.frm
-rw------- 1 mysql mysql 428 Feb 27 20:08 user.MYD
-rw------- 1 mysql mysql 2048 Feb 27 20:08 user.MYI
-rw------- 1 mysql mysql 9148 Feb 27 20:08 user.frm
用root用戶啟動遠程服務

直

安全大忌

因



服務程序出現問題

遠程攻擊者極有

能獲得主機

完全控制權

MySQL從3.23.15版本開始時作了小小

改動

默認安裝

服務要用mysql用戶來啟動


允許root用戶啟動



非要用root用戶來啟動

必須加上-user=root

參數(./safe_mysqld -user=root &)

因

MySQL

有LOAD DATA INFILE和SELECT ... INTO OUTFILE

SQL語句




root用戶啟動了MySQL服務器




數據庫用戶

擁有了root用戶

寫權限


過MySQL還

做了

些限制


比

LOAD DATA INFILE只能讀全局

讀

文件

SELECT ... INTO OUTFILE

能覆蓋已經存


文件

本地

日志文件也

能忽視

包括shell

日志和MySQL自己

日志

有些用戶

本地登陸或備份數據庫

時候

了圖方便

有時會

命令行參數裡直接帶了數據庫

密碼


:
shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql
shell>/usr/local/mysql/bin/mysql -uroot -ptest

些命令會被shell記錄

歷史文件裡

比

bash會寫入用戶目錄

.bash_history文件




些文件

慎被讀



數據庫

密碼

會洩漏

用戶登陸數據庫

執行

SQL命令也會被MySQL記錄

用戶目錄

.mysql_history文件裡



數據庫用戶用SQL語句修改了數據庫密碼

也會因.mysql_history文件而洩漏

所

我們

shell登陸及備份

時候

要

-p

直接加密碼

而


提示

再輸入數據庫密碼

另外

兩

文件我們也應該

讓

記錄我們

操作


防萬


shell>rm .bash_history .mysql_history
shell>ln -s /dev/null .bash_history
shell>ln -s /dev/null .mysql_history
上門

兩條命令把

兩

文件鏈接

/dev/null



我們

操作


會被記錄


兩

文件裡了

數據庫系統由

系列數據庫組成

每

數據庫包含

系列數據庫表

MySQL

用數據庫名

數據目錄建立建立


數據庫目錄

各數據庫表分別

數據庫表名作

文件名

擴展名分別

MYD、MYI、frm

三

文件放

數據庫目錄


MySQL

授權表給數據庫

訪問提供了靈活

權限控制





本地用戶擁有對庫文件

讀權限



攻擊者只需把數據庫目錄打包拷走



拷

自己本機

數據目錄下

能訪問竊取

數據庫

所

MySQL所


主機

安全性


首要

問題

其次


數據目錄和數據文件

安全性

也


權限設置問題