PHP代碼網(wǎng)站如何防范SQL注入漏洞攻擊建議分享
更新時(shí)間:2012年03月01日 21:50:36 作者:
所有的網(wǎng)站管理員都會(huì)關(guān)心網(wǎng)站的安全問(wèn)題。說(shuō)到安全就不得不說(shuō)到SQL注入攻擊(SQL Injection)
黑客通過(guò)SQL注入攻擊可以拿到網(wǎng)站數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)權(quán)限,之后他們就可以拿到網(wǎng)站數(shù)據(jù)庫(kù)中所有的數(shù)據(jù),惡意的黑客可以通過(guò)SQL注入功能篡改數(shù)據(jù)庫(kù)中的數(shù)據(jù)甚至?xí)褦?shù)據(jù)庫(kù)中的數(shù)據(jù)毀壞掉。做為網(wǎng)絡(luò)開(kāi)發(fā)者的你對(duì)這種黑客行為恨之入骨,當(dāng)然也有必要了解一下SQL注入這種功能方式的原理并學(xué)會(huì)如何通過(guò)代碼來(lái)保護(hù)自己的網(wǎng)站數(shù)據(jù)庫(kù)。今天就通過(guò)PHP和MySQL數(shù)據(jù)庫(kù)為例,分享一下我所了解的SQL注入攻擊和一些簡(jiǎn)單的防范措施和一些如何避免SQL注入攻擊的建議。
什么是SQL注入(SQL Injection)?
簡(jiǎn)單來(lái)說(shuō),SQL注入是使用代碼漏洞來(lái)獲取網(wǎng)站或應(yīng)用程序后臺(tái)的SQL數(shù)據(jù)庫(kù)中的數(shù)據(jù),進(jìn)而可以取得數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)權(quán)限。比如,黑客可以利用網(wǎng)站代碼的漏洞,使用SQL注入的方式取得一個(gè)公司網(wǎng)站后臺(tái)數(shù)據(jù)庫(kù)里所有的數(shù)據(jù)信息。拿到數(shù)據(jù)庫(kù)管理員登錄用戶(hù)名和密碼后黑客可以自由修改數(shù)據(jù)庫(kù)中的內(nèi)容甚至刪除該數(shù)據(jù)庫(kù)。SQL注入也可以用來(lái)檢驗(yàn)一個(gè)網(wǎng)站或應(yīng)用的安全性。SQL注入的方式有很多種,但本文將只討論最基本的原理,我們將以PHP和MySQL為例。本文的例子很簡(jiǎn)單,如果你使用其它語(yǔ)言理解起來(lái)也不會(huì)有難度,重點(diǎn)關(guān)注SQL命令即可。
一個(gè)簡(jiǎn)單的SQL注入攻擊案例
假如我們有一個(gè)公司網(wǎng)站,在網(wǎng)站的后臺(tái)數(shù)據(jù)庫(kù)中保存了所有的客戶(hù)數(shù)據(jù)等重要信息。假如網(wǎng)站登錄頁(yè)面的代碼中有這樣一條命令來(lái)讀取用戶(hù)信息。
<?
$q = "SELECT `id` FROM `users` WHERE `username`= ' " .$_GET['username']. " ' AND `password`= ' " .$_GET['password']. " ' ";
?>
現(xiàn)在有一個(gè)黑客想攻擊你的數(shù)據(jù)庫(kù),他會(huì)嘗試在此登錄頁(yè)面的用戶(hù)名的輸入框中輸入以下代碼:
' ; SHOW TABLES;
點(diǎn)擊登陸鍵,這個(gè)頁(yè)面就會(huì)顯示出數(shù)據(jù)庫(kù)中的所有表。如果他現(xiàn)在使用下面這行命令:
'; DROP TABLE [table name];
這樣他就把一張表刪除了!
當(dāng)然,這只是一個(gè)很簡(jiǎn)單的例子,實(shí)際的SQL注入方法比這個(gè)要復(fù)雜得多,黑客也愿意花大量的時(shí)間來(lái)不斷嘗試來(lái)攻擊你的代碼。有一些程序軟件也可以自動(dòng)地來(lái)不斷嘗試SQL注入攻擊。了解了SQL注入的攻擊原理后,我們來(lái)看一下如何防范SQL注入攻擊。
防范SQL注入 - 使用mysql_real_escape_string()函數(shù)
在數(shù)據(jù)庫(kù)操作的代碼中用這個(gè)函數(shù)mysql_real_escape_string()可以將代碼中特殊字符過(guò)濾掉,如引號(hào)等。如下例:
<?
$q = "SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ";
?>
防范SQL注入 - 使用mysql_query()函數(shù)
mysql_query()的特別是它將只執(zhí)行SQL代碼的第一條,而后面的并不會(huì)執(zhí)行?;叵朐谧钋懊娴睦又?,黑客通過(guò)代碼來(lái)例后臺(tái)執(zhí)行了多條SQL命令,顯示出了所有表的名稱(chēng)。所以mysql_query()函數(shù)可以取到進(jìn)一步保護(hù)的作用。我們進(jìn)一步演化剛才的代碼就得到了下面的代碼:
<?
//connection
$database = mysql_connect("localhost", "username","password");
//db selection
mysql_select_db("database", $database);
$q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ", $database);
?>
除此之外,我們還可以在PHP代碼中判斷輸入值的長(zhǎng)度,或者專(zhuān)門(mén)用一個(gè)函數(shù)來(lái)檢查輸入的值。所以在接受用戶(hù)輸入值的地方一定要做好輸入內(nèi)容的過(guò)濾和檢查。當(dāng)然學(xué)習(xí)和了解最新的SQL注入方式也非常重要,這樣才能做到有目的的防范。如果使用的是平臺(tái)式的網(wǎng)站系統(tǒng)如Wordpress,要注意及時(shí)打上官方的補(bǔ)丁或升級(jí)到新的版本。如果有講得不對(duì)的地方或不理解的請(qǐng)?jiān)谠u(píng)論區(qū)留言。
什么是SQL注入(SQL Injection)?
簡(jiǎn)單來(lái)說(shuō),SQL注入是使用代碼漏洞來(lái)獲取網(wǎng)站或應(yīng)用程序后臺(tái)的SQL數(shù)據(jù)庫(kù)中的數(shù)據(jù),進(jìn)而可以取得數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)權(quán)限。比如,黑客可以利用網(wǎng)站代碼的漏洞,使用SQL注入的方式取得一個(gè)公司網(wǎng)站后臺(tái)數(shù)據(jù)庫(kù)里所有的數(shù)據(jù)信息。拿到數(shù)據(jù)庫(kù)管理員登錄用戶(hù)名和密碼后黑客可以自由修改數(shù)據(jù)庫(kù)中的內(nèi)容甚至刪除該數(shù)據(jù)庫(kù)。SQL注入也可以用來(lái)檢驗(yàn)一個(gè)網(wǎng)站或應(yīng)用的安全性。SQL注入的方式有很多種,但本文將只討論最基本的原理,我們將以PHP和MySQL為例。本文的例子很簡(jiǎn)單,如果你使用其它語(yǔ)言理解起來(lái)也不會(huì)有難度,重點(diǎn)關(guān)注SQL命令即可。
一個(gè)簡(jiǎn)單的SQL注入攻擊案例
假如我們有一個(gè)公司網(wǎng)站,在網(wǎng)站的后臺(tái)數(shù)據(jù)庫(kù)中保存了所有的客戶(hù)數(shù)據(jù)等重要信息。假如網(wǎng)站登錄頁(yè)面的代碼中有這樣一條命令來(lái)讀取用戶(hù)信息。
復(fù)制代碼 代碼如下:
<?
$q = "SELECT `id` FROM `users` WHERE `username`= ' " .$_GET['username']. " ' AND `password`= ' " .$_GET['password']. " ' ";
?>
現(xiàn)在有一個(gè)黑客想攻擊你的數(shù)據(jù)庫(kù),他會(huì)嘗試在此登錄頁(yè)面的用戶(hù)名的輸入框中輸入以下代碼:
' ; SHOW TABLES;
點(diǎn)擊登陸鍵,這個(gè)頁(yè)面就會(huì)顯示出數(shù)據(jù)庫(kù)中的所有表。如果他現(xiàn)在使用下面這行命令:
'; DROP TABLE [table name];
這樣他就把一張表刪除了!
當(dāng)然,這只是一個(gè)很簡(jiǎn)單的例子,實(shí)際的SQL注入方法比這個(gè)要復(fù)雜得多,黑客也愿意花大量的時(shí)間來(lái)不斷嘗試來(lái)攻擊你的代碼。有一些程序軟件也可以自動(dòng)地來(lái)不斷嘗試SQL注入攻擊。了解了SQL注入的攻擊原理后,我們來(lái)看一下如何防范SQL注入攻擊。
防范SQL注入 - 使用mysql_real_escape_string()函數(shù)
在數(shù)據(jù)庫(kù)操作的代碼中用這個(gè)函數(shù)mysql_real_escape_string()可以將代碼中特殊字符過(guò)濾掉,如引號(hào)等。如下例:
復(fù)制代碼 代碼如下:
<?
$q = "SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ";
?>
防范SQL注入 - 使用mysql_query()函數(shù)
mysql_query()的特別是它將只執(zhí)行SQL代碼的第一條,而后面的并不會(huì)執(zhí)行?;叵朐谧钋懊娴睦又?,黑客通過(guò)代碼來(lái)例后臺(tái)執(zhí)行了多條SQL命令,顯示出了所有表的名稱(chēng)。所以mysql_query()函數(shù)可以取到進(jìn)一步保護(hù)的作用。我們進(jìn)一步演化剛才的代碼就得到了下面的代碼:
復(fù)制代碼 代碼如下:
<?
//connection
$database = mysql_connect("localhost", "username","password");
//db selection
mysql_select_db("database", $database);
$q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ", $database);
?>
除此之外,我們還可以在PHP代碼中判斷輸入值的長(zhǎng)度,或者專(zhuān)門(mén)用一個(gè)函數(shù)來(lái)檢查輸入的值。所以在接受用戶(hù)輸入值的地方一定要做好輸入內(nèi)容的過(guò)濾和檢查。當(dāng)然學(xué)習(xí)和了解最新的SQL注入方式也非常重要,這樣才能做到有目的的防范。如果使用的是平臺(tái)式的網(wǎng)站系統(tǒng)如Wordpress,要注意及時(shí)打上官方的補(bǔ)丁或升級(jí)到新的版本。如果有講得不對(duì)的地方或不理解的請(qǐng)?jiān)谠u(píng)論區(qū)留言。
相關(guān)文章
PHP常見(jiàn)加密函數(shù)用法示例【crypt與md5】
這篇文章主要介紹了PHP常見(jiàn)加密函數(shù)用法,結(jié)合實(shí)例形式分析了crypt與md5函數(shù)進(jìn)行加密操作相關(guān)使用技巧與注意事項(xiàng),需要的朋友可以參考下2019-01-01
php導(dǎo)出中文內(nèi)容excel文件類(lèi)實(shí)例
這篇文章主要介紹了php導(dǎo)出中文內(nèi)容excel文件類(lèi),實(shí)例分析了php操作帶有中文內(nèi)容的Excel文件及文件導(dǎo)出的實(shí)現(xiàn)方法,需要的朋友可以參考下2015-07-07
非集成環(huán)境的php運(yùn)行環(huán)境(Apache配置、Mysql)搭建安裝圖文教程
這篇文章主要介紹了非集成環(huán)境的php運(yùn)行環(huán)境(Apache配置、Mysql)搭建安裝圖文教程,感興趣的小伙伴們可以參考一下2016-04-04
PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)常量用法實(shí)例
這篇文章主要介紹了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)常量用法,是PHP面向?qū)ο蟪绦蛟O(shè)計(jì)中非常重要的一個(gè)概念,對(duì)于PHP初學(xué)者來(lái)說(shuō)更是有必要加以牢固掌握,需要的朋友可以參考下2014-08-08
php使用strip_tags()去除html標(biāo)簽仍有空白的解決方法
這篇文章主要介紹了php使用strip_tags()去除html標(biāo)簽仍有空白的解決方法,涉及php正則替換的相關(guān)操作技巧,需要的朋友可以參考下2016-07-07

