天天看點

linux之mysql資料庫搭建及sql注入和防禦

資料庫分為三種基本形式 : (其實這些都是衆所周知的,隻是為了知識的完整性,簡單的帶過)

關系型資料庫

層次型資料庫

網狀型資料庫

運作在Linux系統上的關系型資料庫管理系統主要産品:

企業級伺服器:Oracle、Sybase、DB2

中小型伺服器:MySQL、PostgreSQL

一、MySQL簡介和安裝

總體來說,MySQL資料庫管理系統具有以下主要特點:

①可以運作在不同平台上,支援多使用者、多線程和多CPU,沒有記憶體溢出漏洞;

②提供多種資料類型,支援ODBC、SSL、支援多種語言利用MySQL的API進行開發;

③是目前市場上現有産品中運作速度最快的資料庫系統;

④同時通路資料庫的使用者數量不受限制;

⑤可以儲存超過50,000,000條記錄;

⑥使用者權限設定簡單、有效。

檢視系統中是否已安裝mysql軟體,若無任何顯示表明未安裝。

<code>rpm -qa  *mysql*</code>

将DVD安裝CD光牒放入光驅,并将光驅挂載到/mnt目錄中。

<code>mount  /dev/cdrom  /mnt</code>

由于此主機既作為伺服器端又作為用戶端,這裡先安裝MySQL的用戶端安裝包,該安裝包的依賴軟體包是perl-DBI。MySQL的服務端安裝包還要依賴perl-DBD-MySQL軟體包

<a href="http://s2.51cto.com/wyfs02/M02/88/13/wKioL1fpIASicbIeAAGKPpZr6Ew602.png" target="_blank"></a>

<code>MySQL服務的啟動、停止、重新開機和查詢啟動狀态</code>

<code>service  mysqld start|stop|restart|status</code>

<code>2.設定開機自動啟動的功能</code>

<code>chkconfig  --level  35  mysqld  </code><code>on</code>

<code>3.設定MySQL資料庫root賬号的密碼</code>

<code>mysqladmin  -u 使用者名  [-h 伺服器主機名或IP位址] [-p]  password  </code><code>'新密碼'</code>

<code> </code> 

<code>root使用者預設的空密碼,先将root使用者的密碼設定為123,再将使用者root的密碼改為456。</code>

<a href="http://s5.51cto.com/wyfs02/M00/88/16/wKiom1fpIDDwvANAAAARpR7t_TE611.png" target="_blank"></a>

<code>登入及退出MySQL環境</code>

<code>mysql -h 主機名或IP位址  -u 使用者名  -p 使用者密碼</code>

<a href="http://s1.51cto.com/wyfs02/M00/88/16/wKiom1fpIE3iTZJlAABf2qgU9zY596.png" target="_blank"></a>

接下來就是資料庫的知識了

二、資料庫管理

MySQL指令

功能

show  databases;

檢視伺服器中目前有哪些資料庫

use  資料庫名;

選擇所使用的資料庫

create database 資料庫名;

建立資料庫

drop database 資料庫名;

删除指定的資料庫

mysql安裝後預設會建立三個資料庫information_schema、mysql和test, 其中名為“mysql”的資料庫很重要,它裡面儲存有MYSQL的系統資訊,使用者修改密碼和新增使用者,實際上就是針對該資料庫中的有關資料表進行操作。

<a href="http://s1.51cto.com/wyfs02/M00/88/13/wKioL1fpIGuiWM6uAAAaKDEVHUg385.png" target="_blank"></a>

看到information_schema,玩過mysql的手工注入的童鞋是不是很親切了

三、資料表結構管理

create table 表名 (字段設定清單);

在目前資料庫中建立資料表

show  tables;

顯示目前資料庫中有哪些資料表

describe  [資料庫名.]表名;

顯示目前或指定資料庫中指定資料表的結構(字段)資訊

drop table [資料庫名.]表名;

建立表的時候必須至少有一個列

<a href="http://s2.51cto.com/wyfs02/M02/88/13/wKioL1fpIIjg1fIbAABEaDFXKuI794.png" target="_blank"></a>

四、記錄的檢視、插入、修改與删除

insert into 表名(字段1,字段2,……) values(字段1的值, 字段2的值,……);

向資料表中插入新的記錄

update 表名 set 字段名1=字段值1[,字段名2=字段值2]  where 條件表達式;

修改、更新資料表中的記錄

select 字段名1,字段名2……from 表名where 條件表達式;

從資料表中查找符合條件的記錄

select * from 表名;

顯示目前資料庫的表中的記錄

delete from 表名 where 條件表達式;

在資料表中删除指定的記錄

delete from 表名;

将目前資料庫表中記錄清空

向wt庫wt表中插入id列,字段為17。

<a href="http://s1.51cto.com/wyfs02/M01/88/16/wKiom1fpIK7DtPyKAAAj4MwSMnA025.png" target="_blank"></a>

将wt庫wt表中的id列的字段更新為117.

<a href="http://s3.51cto.com/wyfs02/M01/88/16/wKiom1fpIMiwn3t-AABKGnDfgg8873.png" target="_blank"></a>

五、使用者與權限管理

<code>建立與授權使用者 grant  權限清單 on 資料庫名.表名 to 使用者名@來源位址 [identified by ‘密碼’]</code>

                主要使用者權限

select

讀取表的資料

insert

向表中插入資料

update

更新表中的資料

delete

删除表中的資料

index

建立或删除表的索引

create

建立新的資料庫和表

alter

修改表的結構

grant

将自己擁有的某些權限授予其他使用者

drop

删除現存的資料庫和表

file

在資料庫伺服器上讀取和寫入檔案

reload

重新裝載授權表

process

檢視目前執行的查詢

shutdown

停止或關閉mysql服務

all

具有全部權限

1.增加一個名為test的MySQL使用者,允許其從本地主機(即MySQL資料庫所在的主機)上登入,且隻能對資料庫student進行查詢,使用者密碼設定為123456。

<a href="http://s3.51cto.com/wyfs02/M00/88/13/wKioL1fpIQyTMgf0AAAb10ZLsBk745.png" target="_blank"></a>

驗證該使用者能進行登入、查詢,無法做其他操作,和預想的是一樣的。

<a href="http://s5.51cto.com/wyfs02/M01/88/13/wKioL1fpISeDqkf_AABRk9amItk096.png" target="_blank"></a>

2.檢視使用者的權限

<code>show  grants  </code><code>for</code>  <code>使用者名@域名或IP位址;</code>

<a href="http://s1.51cto.com/wyfs02/M01/88/13/wKioL1fpIUrxW_21AAA0zP_SRcc180.png" target="_blank"></a>

3.撤銷使用者的權限

<code>revoke  權限清單  </code><code>on</code> <code>資料庫名.表名  </code><code>from</code>  <code>使用者名@域名或IP位址;</code>

<a href="http://s4.51cto.com/wyfs02/M02/88/16/wKiom1fpIW7APQizAABHWONyuBQ152.png" target="_blank"></a>

六、資料庫的備份與恢複

(1).直接備份資料庫所在的目錄

使用cp、tar等指令直接備份資料庫所存放的目錄

2.使用mysqldump指令備份和恢複

<code>mysqldump -u 使用者名 -p [密碼] [選項] [資料庫名] [表名] &gt; /備份路徑/備份檔案名</code>

<a href="http://s1.51cto.com/wyfs02/M00/88/16/wKiom1fpIYijWo0HAAB1MjYlm3M516.png" target="_blank"></a>

附:mysqldump的幾種常用方法:

(1)導出整個資料庫(包括資料庫中的資料)

mysqldump -u username -p dbname &gt; dbname.sql    

(2)導出資料庫結構(不含資料)

mysqldump -u username -p -d dbname &gt; dbname.sql    

(3)導出資料庫中的某張資料表(包含資料)

 mysqldump -u username -p dbname tablename &gt; tablename.sql    

(4)導出資料庫中的某張資料表的表結構(不含資料)

mysqldump -u username -p -d dbname tablename &gt; tablename.sql  

常用參數說明:

--all-databases——備份伺服器中的所有資料庫内容;

--opt——對備份過程進行優化,此項為預設選項

(2.)恢複(導入)資料

<code>mysql -u root -p [資料庫名] &lt; /備份路徑/備份檔案名</code>

<a href="http://s5.51cto.com/wyfs02/M02/88/13/wKioL1fpIazg1pg6AAAQKkFLykQ687.png" target="_blank"></a>

七、sql注入

SQL注入産生的原因,和棧溢出、XSS等很多其他的攻擊方法類似,就是未經檢查或者未經充分檢查的使用者輸入資料,意外變成了代碼被執行。針對于SQL注入,則是使用者送出的資料,被資料庫系統編譯而産生了開發者預期之外的動作。也就是,SQL注入是使用者輸入的資料,在拼接SQL語句的過程中,超越了資料本身,成為了SQL語句查詢邏輯的一部分,然後這樣被拼接出來的SQL語句被資料庫執行,産生了開發者預期之外的動作。

是以從根本上防止上述類型攻擊的手段,還是避免資料變成代碼被執行,時刻厘清代碼和資料的界限。而具體到SQL注入來說,被執行的惡意代碼是通過資料庫的SQL解釋引擎編譯得到的,是以隻要避免使用者輸入的資料被資料庫系統編譯就可以了。

現在的資料庫系統都提供SQL語句的預編譯(prepare)和查詢參數綁定功能,在SQL語句中放置占位符'?',然後将帶有占位符的SQL語句傳給資料庫編譯,執行的時候才将使用者輸入的資料作為執行的參數傳給使用者。這樣的操作不僅使得SQL語句在書寫的時候不再需要拼接,看起來也更直接,而且使用者輸入的資料也沒有機會被送到資料庫的SQL解釋器被編譯執行,也不會越權變成代碼。

如何确定SQL注入漏洞

通過以上的執行個體,我們仍然還會有疑問:黑客并不知道我們程式代碼的邏輯和SQL語句的寫法,他是如何确定一個網站是否存在SQL注入漏洞呢?一般說來有以下2種途徑:

1、錯誤提示

如果目标Web網站開啟了錯誤顯示,攻擊者就可以通過反複調整發送的參數、檢視頁面列印的錯誤資訊,推測出Web網站使用的資料庫和開發語言等重要資訊。

2、盲注

除非運維人員疏忽,否則大部分的Web營運網站應該都關閉了錯誤提示資訊,此時攻擊者一般會采用盲注的技巧來進行反複的嘗試判斷。

之前對sql手工注入和sql注入神器sqlmap做過很詳細的介紹,這裡就針對sql注入的理論做補充。詳細的sql注入姿勢請檢視前面的文章。

防禦SQL注入

對于伺服器配置層面的防範,應該保證生産環境的Webserver是關閉錯誤資訊的,比如PHP在生産環境的配置檔案php.ini中的display_errors應該設定為Off,這樣就關閉了錯誤提示,下面我們更多的從編碼的角度來看看如何防範SQL注入。

但凡有SQL注入漏洞的程式,都是因為程式要接受來自用戶端使用者輸入的變量或URL傳遞的參數,并且這個變量或參數是組成SQL語句的一部分,對于使用者輸入的内容或傳遞的參數,我們應該要時刻保持警惕,這是安全領域裡的「外部資料不可信任」的原則,縱觀Web安全領域的各種攻擊方式,大多數都是因為開發者違反了這個原則而導緻的,是以自然能想到的,就是從變量的檢測、過濾、驗證下手,確定變量是開發者所預想的。

1、檢查變量資料類型和格式

如果你的SQL語句是類似where id={$id}這種形式,資料庫裡所有的id都是數字,那麼就應該在SQL被執行前,檢查確定變量id是int類型;如果是接受郵箱,那就應該檢查并嚴格確定變量一定是郵箱的格式,其他的類型比如日期、時間等也是一個道理。總結起來:隻要是有固定格式的變量,在SQL語句執行前,應該嚴格按照固定格式去檢查,確定變量是我們預想的格式,這樣很大程度上可以避免SQL注入攻擊。

2、過濾特殊符号

對于無法确定固定格式的變量,一定要進行特殊符号過濾或轉義處理。以PHP為例,通常是采用addslashes函數,它會在指定的預定義字元前添加反斜杠轉義,這些預定義的字元是:單引号 (') 雙引号 (") 反斜杠 (\) NULL。

3、綁定變量,使用預編譯語句

MySQL的mysqli驅動提供了預編譯語句的支援,不同的程式語言,都分别有使用預編譯語句的方法

4.資料庫資訊加密安全

在Web開發中,傳統的加解密大緻可以分為三種:

1、對稱加密:即加密方和解密方都使用相同的加密算法和密鑰,這種方案的密鑰的儲存非常關鍵,因為算法是公開的,而密鑰是保密的,一旦密匙洩露,黑客仍然可以輕易解密。常見的對稱加密算法有:AES、DES等。

2、非對稱加密:即使用不同的密鑰來進行加解密,密鑰被分為公鑰和私鑰,用私鑰加密的資料必須使用公鑰來解密,同樣用公鑰加密的資料必須用對應的私鑰來解密,常見的非對稱加密算法有:RSA等。

3、不可逆加密:利用雜湊演算法使資料加密之後無法解密回原資料,這樣的雜湊演算法常用的有:md5、SHA-1等。

sql防禦總結

1、不要随意開啟生産環境中Webserver的錯誤顯示。

2、永遠不要信任來自使用者端的變量輸入,有固定格式的變量一定要嚴格檢查對應的格式,沒有固定格式的變量需要對引号等特殊字元進行必要的過濾轉義。

3、使用預編譯綁定變量的SQL語句。

4、做好資料庫帳号權限管理。

5、嚴格加密處理使用者的機密資訊。

本文轉自 wt7315 51CTO部落格,原文連結:http://blog.51cto.com/wt7315/1856845