MySQL中文手冊下載地址:http://down.51cto.com/data/2244392
“專業(yè)、務(wù)實、高效、創(chuàng)新、把客戶的事當成自己的事”是我們每一個人一直以來堅持追求的企業(yè)文化。 創(chuàng)新互聯(lián)建站是您可以信賴的網(wǎng)站建設(shè)服務(wù)商、專業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專注于網(wǎng)站建設(shè)、成都做網(wǎng)站、軟件開發(fā)、設(shè)計服務(wù)業(yè)務(wù)。我們始終堅持以客戶需求為導(dǎo)向,結(jié)合用戶體驗與視覺傳達,提供有針對性的項目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場,引領(lǐng)市場!
sql注入各種姿勢:http://wt7315.blog.51cto.com/10319657/1828167
sqlmap注入神器詳解:http://wt7315.blog.51cto.com/10319657/1841241
數(shù)據(jù)庫分為三種基本形式 : (其實這些都是眾所周知的,只是為了知識的完整性,簡單的帶過)
關(guān)系型數(shù)據(jù)庫
層次型數(shù)據(jù)庫
網(wǎng)狀型數(shù)據(jù)庫
運行在Linux系統(tǒng)上的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)主要產(chǎn)品:
企業(yè)級服務(wù)器:Oracle、Sybase、DB2
中小型服務(wù)器:MySQL、PostgreSQL
一、MySQL簡介和安裝
總體來說,MySQL數(shù)據(jù)庫管理系統(tǒng)具有以下主要特點:
①可以運行在不同平臺上,支持多用戶、多線程和多CPU,沒有內(nèi)存溢出漏洞;
②提供多種數(shù)據(jù)類型,支持ODBC、SSL、支持多種語言利用MySQL的API進行開發(fā);
③是目前市場上現(xiàn)有產(chǎn)品中運行速度最快的數(shù)據(jù)庫系統(tǒng);
④同時訪問數(shù)據(jù)庫的用戶數(shù)量不受限制;
⑤可以保存超過50,000,000條記錄;
⑥用戶權(quán)限設(shè)置簡單、有效。
查看系統(tǒng)中是否已安裝mysql軟件,若無任何顯示表明未安裝。
rpm -qa *mysql*
將DVD安裝光盤放入光驅(qū),并將光驅(qū)掛載到/mnt目錄中。
mount /dev/cdrom /mnt
由于此主機既作為服務(wù)器端又作為客戶端,這里先安裝MySQL的客戶端安裝包,該安裝包的依賴軟件包是perl-DBI。MySQL的服務(wù)端安裝包還要依賴perl-DBD-MySQL軟件包
MySQL服務(wù)的啟動、停止、重啟和查詢啟動狀態(tài) service mysqld start|stop|restart|status 2.設(shè)置開機自動啟動的功能 chkconfig --level 35 mysqld on 3.設(shè)置MySQL數(shù)據(jù)庫root賬號的密碼 mysqladmin -u 用戶名 [-h 服務(wù)器主機名或IP地址] [-p] password '新口令' root用戶默認的空口令,先將root用戶的密碼設(shè)置為123,再將用戶root的密碼改為456。
登錄及退出MySQL環(huán)境 mysql -h 主機名或IP地址 -u 用戶名 -p 用戶密碼
接下來就是數(shù)據(jù)庫的知識了
二、數(shù)據(jù)庫管理
MySQL命令 | 功能 |
show databases; | 查看服務(wù)器中當前有哪些數(shù)據(jù)庫 |
use 數(shù)據(jù)庫名; | 選擇所使用的數(shù)據(jù)庫 |
create database 數(shù)據(jù)庫名; | 創(chuàng)建數(shù)據(jù)庫 |
drop database 數(shù)據(jù)庫名; | 刪除指定的數(shù)據(jù)庫 |
mysql安裝后默認會創(chuàng)建三個數(shù)據(jù)庫information_schema、mysql和test,其中名為“mysql”的數(shù)據(jù)庫很重要,它里面保存有MYSQL的系統(tǒng)信息,用戶修改密碼和新增用戶,實際上就是針對該數(shù)據(jù)庫中的有關(guān)數(shù)據(jù)表進行操作。
看到information_schema,玩過mysql的手工注入的童鞋是不是很親切了
三、數(shù)據(jù)表結(jié)構(gòu)管理
MySQL命令 | 功能 |
create table 表名(字段設(shè)定列表); | 在當前數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表 |
show tables; | 顯示當前數(shù)據(jù)庫中有哪些數(shù)據(jù)表 |
describe [數(shù)據(jù)庫名.]表名; | 顯示當前或指定數(shù)據(jù)庫中指定數(shù)據(jù)表的結(jié)構(gòu)(字段)信息 |
drop table [數(shù)據(jù)庫名.]表名; | drop table [數(shù)據(jù)庫名.]表名; |
創(chuàng)建表的時候必須至少有一個列
四、記錄的查看、插入、修改與刪除
MySQL命令 | 功能 |
insert into 表名(字段1,字段2,……) values(字段1的值,字段2的值,……); | 向數(shù)據(jù)表中插入新的記錄 |
update 表名set字段名1=字段值1[,字段名2=字段值2] where條件表達式;
| 修改、更新數(shù)據(jù)表中的記錄
|
select 字段名1,字段名2……from表名where條件表達式;
| 從數(shù)據(jù)表中查找符合條件的記錄
|
select * from 表名;
| 顯示當前數(shù)據(jù)庫的表中的記錄
|
delete from 表名where條件表達式;
| 在數(shù)據(jù)表中刪除指定的記錄
|
delete from 表名;
| 將當前數(shù)據(jù)庫表中記錄清空 |
向wt庫wt表中插入id列,字段為17。
將wt庫wt表中的id列的字段更新為117.
五、用戶與權(quán)限管理
創(chuàng)建與授權(quán)用戶 grant 權(quán)限列表 on 數(shù)據(jù)庫名.表名 to 用戶名@來源地址 [identified by ‘密碼’]
主要用戶權(quán)限
select | 讀取表的數(shù)據(jù) | insert | 向表中插入數(shù)據(jù) |
update | 更新表中的數(shù)據(jù) | delete | 刪除表中的數(shù)據(jù) |
index | 創(chuàng)建或刪除表的索引 | create | 創(chuàng)建新的數(shù)據(jù)庫和表 |
alter | 修改表的結(jié)構(gòu) | grant | 將自己擁有的某些權(quán)限授予其他用戶 |
drop | 刪除現(xiàn)存的數(shù)據(jù)庫和表 | file | 在數(shù)據(jù)庫服務(wù)器上讀取和寫入文件 |
reload | 重新裝載授權(quán)表 | process | 查看當前執(zhí)行的查詢 |
shutdown | 停止或關(guān)閉mysql服務(wù) | all | 具有全部權(quán)限 |
1.增加一個名為test的MySQL用戶,允許其從本地主機(即MySQL數(shù)據(jù)庫所在的主機)上登錄,且只能對數(shù)據(jù)庫student進行查詢,用戶密碼設(shè)置為123456。
驗證該用戶能進行登錄、查詢,無法做其他操作,和預(yù)想的是一樣的。
2.查看用戶的權(quán)限
show grants for 用戶名@域名或IP地址;
3.撤銷用戶的權(quán)限
revoke 權(quán)限列表 on 數(shù)據(jù)庫名.表名 from 用戶名@域名或IP地址;
六、數(shù)據(jù)庫的備份與恢復(fù)
(1).直接備份數(shù)據(jù)庫所在的目錄
使用cp、tar等命令直接備份數(shù)據(jù)庫所存放的目錄
2.使用mysqldump命令備份和恢復(fù)
mysqldump -u 用戶名 -p [密碼] [選項] [數(shù)據(jù)庫名] [表名] > /備份路徑/備份文件名
附:mysqldump的幾種常用方法:
(1)導(dǎo)出整個數(shù)據(jù)庫(包括數(shù)據(jù)庫中的數(shù)據(jù))
mysqldump -u username -p dbname > dbname.sql
(2)導(dǎo)出數(shù)據(jù)庫結(jié)構(gòu)(不含數(shù)據(jù))
mysqldump -u username -p -d dbname > dbname.sql
(3)導(dǎo)出數(shù)據(jù)庫中的某張數(shù)據(jù)表(包含數(shù)據(jù))
mysqldump -u username -p dbname tablename > tablename.sql
(4)導(dǎo)出數(shù)據(jù)庫中的某張數(shù)據(jù)表的表結(jié)構(gòu)(不含數(shù)據(jù))
mysqldump -u username -p -d dbname tablename > tablename.sql
常用參數(shù)說明:
--all-databases——備份服務(wù)器中的所有數(shù)據(jù)庫內(nèi)容;
--opt——對備份過程進行優(yōu)化,此項為默認選項
(2.)恢復(fù)(導(dǎo)入)數(shù)據(jù)
mysql -u root -p [數(shù)據(jù)庫名] < /備份路徑/備份文件名
七、sql注入
SQL注入產(chǎn)生的原因,和棧溢出、XSS等很多其他的***方法類似,就是未經(jīng)檢查或者未經(jīng)充分檢查的用戶輸入數(shù)據(jù),意外變成了代碼被執(zhí)行。針對于SQL注入,則是用戶提交的數(shù)據(jù),被數(shù)據(jù)庫系統(tǒng)編譯而產(chǎn)生了開發(fā)者預(yù)期之外的動作。也就是,SQL注入是用戶輸入的數(shù)據(jù),在拼接SQL語句的過程中,超越了數(shù)據(jù)本身,成為了SQL語句查詢邏輯的一部分,然后這樣被拼接出來的SQL語句被數(shù)據(jù)庫執(zhí)行,產(chǎn)生了開發(fā)者預(yù)期之外的動作。
所以從根本上防止上述類型***的手段,還是避免數(shù)據(jù)變成代碼被執(zhí)行,時刻分清代碼和數(shù)據(jù)的界限。而具體到SQL注入來說,被執(zhí)行的惡意代碼是通過數(shù)據(jù)庫的SQL解釋引擎編譯得到的,所以只要避免用戶輸入的數(shù)據(jù)被數(shù)據(jù)庫系統(tǒng)編譯就可以了。
現(xiàn)在的數(shù)據(jù)庫系統(tǒng)都提供SQL語句的預(yù)編譯(prepare)和查詢參數(shù)綁定功能,在SQL語句中放置占位符'?',然后將帶有占位符的SQL語句傳給數(shù)據(jù)庫編譯,執(zhí)行的時候才將用戶輸入的數(shù)據(jù)作為執(zhí)行的參數(shù)傳給用戶。這樣的操作不僅使得SQL語句在書寫的時候不再需要拼接,看起來也更直接,而且用戶輸入的數(shù)據(jù)也沒有機會被送到數(shù)據(jù)庫的SQL解釋器被編譯執(zhí)行,也不會越權(quán)變成代碼。
如何確定SQL注入漏洞
通過以上的實例,我們?nèi)匀贿€會有疑問:***并不知道我們程序代碼的邏輯和SQL語句的寫法,他是如何確定一個網(wǎng)站是否存在SQL注入漏洞呢?一般說來有以下2種途徑:
1、錯誤提示
如果目標Web網(wǎng)站開啟了錯誤顯示,***者就可以通過反復(fù)調(diào)整發(fā)送的參數(shù)、查看頁面打印的錯誤信息,推測出Web網(wǎng)站使用的數(shù)據(jù)庫和開發(fā)語言等重要信息。
2、盲注
除非運維人員疏忽,否則大部分的Web運營網(wǎng)站應(yīng)該都關(guān)閉了錯誤提示信息,此時***者一般會采用盲注的技巧來進行反復(fù)的嘗試判斷。
之前對sql手工注入和sql注入神器sqlmap做過很詳細的介紹,這里就針對sql注入的理論做補充。詳細的sql注入姿勢請查看前面的文章。
防御SQL注入
對于服務(wù)器配置層面的防范,應(yīng)該保證生產(chǎn)環(huán)境的Webserver是關(guān)閉錯誤信息的,比如PHP在生產(chǎn)環(huán)境的配置文件php.ini中的display_errors應(yīng)該設(shè)置為Off,這樣就關(guān)閉了錯誤提示,下面我們更多的從編碼的角度來看看如何防范SQL注入。
但凡有SQL注入漏洞的程序,都是因為程序要接受來自客戶端用戶輸入的變量或URL傳遞的參數(shù),并且這個變量或參數(shù)是組成SQL語句的一部分,對于用戶輸入的內(nèi)容或傳遞的參數(shù),我們應(yīng)該要時刻保持警惕,這是安全領(lǐng)域里的「外部數(shù)據(jù)不可信任」的原則,縱觀Web安全領(lǐng)域的各種***方式,大多數(shù)都是因為開發(fā)者違反了這個原則而導(dǎo)致的,所以自然能想到的,就是從變量的檢測、過濾、驗證下手,確保變量是開發(fā)者所預(yù)想的。
1、檢查變量數(shù)據(jù)類型和格式
如果你的SQL語句是類似where id={$id}這種形式,數(shù)據(jù)庫里所有的id都是數(shù)字,那么就應(yīng)該在SQL被執(zhí)行前,檢查確保變量id是int類型;如果是接受郵箱,那就應(yīng)該檢查并嚴格確保變量一定是郵箱的格式,其他的類型比如日期、時間等也是一個道理??偨Y(jié)起來:只要是有固定格式的變量,在SQL語句執(zhí)行前,應(yīng)該嚴格按照固定格式去檢查,確保變量是我們預(yù)想的格式,這樣很大程度上可以避免SQL注入***。
2、過濾特殊符號
對于無法確定固定格式的變量,一定要進行特殊符號過濾或轉(zhuǎn)義處理。以PHP為例,通常是采用addslashes函數(shù),它會在指定的預(yù)定義字符前添加反斜杠轉(zhuǎn)義,這些預(yù)定義的字符是:單引號(')雙引號(")反斜杠(\) NULL。
3、綁定變量,使用預(yù)編譯語句
MySQL的mysqli驅(qū)動提供了預(yù)編譯語句的支持,不同的程序語言,都分別有使用預(yù)編譯語句的方法
4.數(shù)據(jù)庫信息加密安全
在Web開發(fā)中,傳統(tǒng)的加解密大致可以分為三種:
1、對稱加密:即加密方和解密方都使用相同的加密算法和密鑰,這種方案的密鑰的保存非常關(guān)鍵,因為算法是公開的,而密鑰是保密的,一旦密匙泄露,***仍然可以輕易解密。常見的對稱加密算法有:AES、DES等。
2、非對稱加密:即使用不同的密鑰來進行加解密,密鑰被分為公鑰和私鑰,用私鑰加密的數(shù)據(jù)必須使用公鑰來解密,同樣用公鑰加密的數(shù)據(jù)必須用對應(yīng)的私鑰來解密,常見的非對稱加密算法有:RSA等。
3、不可逆加密:利用哈希算法使數(shù)據(jù)加密之后無法解密回原數(shù)據(jù),這樣的哈希算法常用的有:md5、SHA-1等。
sql防御總結(jié)
1、不要隨意開啟生產(chǎn)環(huán)境中Webserver的錯誤顯示。
2、永遠不要信任來自用戶端的變量輸入,有固定格式的變量一定要嚴格檢查對應(yīng)的格式,沒有固定格式的變量需要對引號等特殊字符進行必要的過濾轉(zhuǎn)義。
3、使用預(yù)編譯綁定變量的SQL語句。
4、做好數(shù)據(jù)庫帳號權(quán)限管理。
5、嚴格加密處理用戶的機密信息。