明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

sql注入案例以及如何防sql注入

[摘要]概述??sql注入就是利用某些數(shù)據(jù)庫(kù)的外接接口將用戶數(shù)據(jù)插入到實(shí)際的數(shù)據(jù)庫(kù)操作語(yǔ)言當(dāng)中,從而達(dá)到入侵?jǐn)?shù)據(jù)庫(kù)乃至操作系統(tǒng)的目的。在安全領(lǐng)域,我們永遠(yuǎn)不要信任用戶的輸入,我們必須認(rèn)定用戶輸入的數(shù)據(jù)都是不安全的,我們都需要對(duì)用戶輸入的數(shù)據(jù)進(jìn)行過(guò)濾處理。沒(méi)有(運(yùn)行時(shí))編譯,就沒(méi)有注入。所以從根本上防止上述...

概述

??sql注入就是利用某些數(shù)據(jù)庫(kù)的外接接口將用戶數(shù)據(jù)插入到實(shí)際的數(shù)據(jù)庫(kù)操作語(yǔ)言當(dāng)中,從而達(dá)到入侵?jǐn)?shù)據(jù)庫(kù)乃至操作系統(tǒng)的目的。在安全領(lǐng)域,我們永遠(yuǎn)不要信任用戶的輸入,我們必須認(rèn)定用戶輸入的數(shù)據(jù)都是不安全的,我們都需要對(duì)用戶輸入的數(shù)據(jù)進(jìn)行過(guò)濾處理。沒(méi)有(運(yùn)行時(shí))編譯,就沒(méi)有注入。所以從根本上防止上述類型攻擊的手段,還是避免數(shù)據(jù)變成代碼被執(zhí)行,時(shí)刻分清代碼和數(shù)據(jù)的界限。而具體到SQL注入來(lái)說(shuō),被執(zhí)行的惡意代碼是通過(guò)數(shù)據(jù)庫(kù)的SQL解釋引擎編譯得到的,所以只要避免用戶輸入的數(shù)據(jù)被數(shù)據(jù)庫(kù)系統(tǒng)編譯就可以了。
??與其他數(shù)據(jù)庫(kù)不同,MySQL可以運(yùn)行在不同的SQL Mode(SQL服務(wù)器模式)下,并且可以為不同客戶端應(yīng)用不同模式。這樣每個(gè)應(yīng)用程序可以根據(jù)自己的需求來(lái)定制服務(wù)器的操作模式。模式定義MySQL應(yīng)支持哪些SQL語(yǔ)法,以及應(yīng)執(zhí)行哪種數(shù)據(jù)驗(yàn)證檢查。這有點(diǎn)類似于apache配置不同級(jí)別的錯(cuò)誤日志,報(bào)告哪些錯(cuò)誤,又不報(bào)告哪些錯(cuò)誤。

SQL注入

1.注入實(shí)例

//php代碼
$unsafe_variable = $_POST['user_input'];   
mysql_query("INSERT INTO `table` (`column`) VALUES ('{$unsafe_variable}')");

當(dāng)post中代碼如下時(shí)候:

value'); DROP TABLE table;--

查詢代碼變成

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

這樣會(huì)直接刪除table表,你的數(shù)據(jù)被破壞了。

2.防止sql注入

方法一
prepareStatement+Bind-Variable:SQL語(yǔ)句和查詢的參數(shù)分別發(fā)送給數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行解析。
對(duì)于php來(lái)說(shuō)有兩種實(shí)現(xiàn)方式。

//使用PDO(PHP data object)
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');  
$stmt->execute(array('name' => $name));  
foreach ($stmt as $row) {  
    // do something with $row  
}

//使用mysql擴(kuò)展-mysqli
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}

方式二
對(duì)查詢語(yǔ)句進(jìn)行轉(zhuǎn)義(最常見(jiàn)的方式):使用應(yīng)用程序提供的轉(zhuǎn)換函數(shù)。
應(yīng)用 函數(shù)

 -------- 
 MySQL C 
API
 
mysql_real_escape_string
() 
 MySQL++ escape和quote修飾符 
 PHP 使用mysql_real_escape_string()(適用于PHP4.3.0以前),之后可以使用mysqli或pdo 
 
Perl
 DBI placeholder或quote() 
 Ruby DBI placeholder或quote() 

方式三
使用自己定義函數(shù)進(jìn)行校驗(yàn):其本質(zhì)上還是對(duì)輸入非法數(shù)據(jù)進(jìn)行轉(zhuǎn)義和過(guò)濾。
輸入驗(yàn)證可以分為:1.整理數(shù)據(jù)使之有效;2.拒絕已知的非法輸入;3.只接收已知的合法輸入。

方式四
使用存儲(chǔ)過(guò)程。
存儲(chǔ)過(guò)程參見(jiàn): (9)mysql中的存儲(chǔ)過(guò)程和自定義函數(shù)

sql服務(wù)器模式

1.sql模式語(yǔ)法

#查看當(dāng)前sql模式
select @@sql_mode;
#查看當(dāng)前sql模式
SELECT @@session.sql_mode;
#修改當(dāng)前sql模式
SET [SESSION][GLOBAL] sql_mode='modes';
  • 其中session選項(xiàng)表示只在本次連接生效;而global表示在本次連接不生效,下次連接生效。

  • 也可以使用“--sql-mode='modes'”,在MySQL啟動(dòng)時(shí)候設(shè)置sql_mode。

  • 可以在配置文件中設(shè)置。

    2.sql_mode常用值

    ONLY_FULL_GROUP_BY:
    對(duì)于GROUP BY聚合操作,如果在SELECT中的列,沒(méi)有在GROUP BY中出現(xiàn),那么這個(gè)SQL是不合法的,因?yàn)榱胁辉贕ROUP BY從句中。

NO_AUTO_VALUE_ON_ZERO:
該值影響自增長(zhǎng)列的插入。默認(rèn)設(shè)置下,插入0或NULL代表生成下一個(gè)自增長(zhǎng)值。如果用戶 希望插入的值為0,而該列又是自增長(zhǎng)的,那么這個(gè)選項(xiàng)就有用了。

STRICT_TRANS_TABLES:
在該模式下,如果一個(gè)值不能插入到一個(gè)事務(wù)表中,則中斷當(dāng)前的操作,對(duì)非事務(wù)表不做限制。

NO_ZERO_IN_DATE:
在嚴(yán)格模式下,不允許日期和月份為零。

NO_ZERO_DATE:
設(shè)置該值,mysql數(shù)據(jù)庫(kù)不允許插入零日期,插入零日期會(huì)拋出錯(cuò)誤而不是警告。

ERROR_FOR_pISION_BY_ZERO:
在INSERT或UPDATE過(guò)程中,如果數(shù)據(jù)被零除,則產(chǎn)生錯(cuò)誤而非警告。如 果未給出該模式,那么數(shù)據(jù)被零除時(shí)MySQL返回NULL。

NO_AUTO_CREATE_USER:
禁止GRANT創(chuàng)建密碼為空的用戶。

NO_ENGINE_SUBSTITUTION:
如果需要的存儲(chǔ)引擎被禁用或未編譯,那么拋出錯(cuò)誤。不設(shè)置此值時(shí),用默認(rèn)的存儲(chǔ)引擎替代,并拋出一個(gè)異常。

PIPES_AS_CONCAT:
將" "視為字符串的連接操作符而非或運(yùn)算符,這和Oracle數(shù)據(jù)庫(kù)是一樣的,也和字符串的拼接函數(shù)Concat相類似。

ANSI_QUOTES:
啟用ANSI_QUOTES后,不能用雙引號(hào)來(lái)引用字符串,因?yàn)樗唤忉尀樽R(shí)別符。

說(shuō)明

ORACLE的sql_mode設(shè)置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER。

【相關(guān)推薦】

1. 免費(fèi)mysql在線視頻教程

2. MySQL最新手冊(cè)教程

3. 布爾教育燕十八mysql入門(mén)視頻教程

以上就是sql注入實(shí)例以及如何防sql注入的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門(mén)到精通的SQL知識(shí)。